home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / rigctrl / voicetrk / repe2.asm < prev    next >
Assembly Source File  |  1993-08-19  |  87KB  |  2,596 lines

  1. ;###############################{  VHF  }####################################
  2.  
  3. ; 05/10/92
  4. ; * cambios en el manejo del Patch. No debe desactivarse la RPT fuera de modo Yaesu. Ademas en cualquier modo mantiene a PB1=1
  5. ; Version       1.02    ; apaga rpt luego de id automatico y apaga rpt luego de anti-poncho/ y state25 arranca en 0
  6. ; Escrito por Alejandro Bonello (o al menos intentado)
  7. ; ***************************************************************************
  8. ; ---------------- Programa de control del 6809 para repetidora -------------
  9. ; ***************************************************************************
  10. ;                         UNIVERSAL REPEATER CONTROLER
  11.  
  12. RAM             EQU     $0000
  13. MEM             EQU     $1000
  14. EPROM           EQU     $E300           ; $F000
  15. TABLAS          EQU     $E000
  16.             
  17. FIN_RAM         EQU     $07FF
  18. STACK_U         EQU     $05FF
  19.  
  20.  
  21. ;---------------< definicion de areas >--------------------------------------
  22.  
  23.         ORG     RAM
  24.  
  25. ADC_STATE       RMB     1       ; esdado del conversor A/D
  26. PATCH           RMB     1       ; indica si el patch esta activado o no (sirve para que cuando esta activado no funcione el Anti-Poncho ni se desactive la RPT, etc)
  27. OFS_TABLA       RMB     2       ; variable de uso general utilizada para guardar addresses de memoria de 16 bits
  28. VAR_0           RMB     1       ; variable de uso general 
  29. VAR_1           RMB     1       ; que pensas que puede ser NABO? (idem var_0)
  30. INT_CHANGE      RMB     1       ; sirve para saber cuando cambia de estado el clock de 100Hz
  31. SUMNO           RMB     3       ; se almacena aqui un numero de 6 cifras a sumar o restar
  32. RESULTADO       RMB     3       ; se almacena el resultado de una suma o resta
  33. BUFFER          RMB     1       ; variable utilizada por TIME_OUT para comprovar si la rpt cambio de estado (ej: TX/RX)
  34. STATE_RPT       RMB     1       ; variable utilizada por TIME_OUT para indicarle a el resto del programa el estado de la rpt. esto es: 1 = TX/ 0 = QAP
  35. WAIT_TIME       RMB     4       ; se utiliza para irlo decrementando cada 10ms y hacer una rutina de espera (lo utiliza WAIT e _IRQ)
  36. PRESSED_KEY     RMB    16       ; se almacena lo leido desde el teclado por TECLADO
  37. ABORT_MODE      RMB     1       ; aqui se almacena si el abort fue producido por un "*" o por un "#". esto se logra: ABORT=$0B (para "*") y ABORT=$0C (para "#"). en caso de trabajo normal en esta variable puede haber cualquier otro caracter sin problema.
  38. STATE_00        RMB     1       ; en las variables STATE se almacena la informacion de las distintas funciones del uP (van de STATE_00 a STATE_99)
  39. STATE_01        RMB     1
  40. STATE_02        RMB     1
  41. STATE_03        RMB     1
  42. STATE_04        RMB    16
  43. STATE_05        RMB     1
  44. STATE_06        RMB     1
  45. STATE_07        RMB     1
  46. STATE_08        RMB     1
  47. STATE_09        RMB     1
  48. STATE_10        RMB     2
  49. STATE_11        RMB     1
  50. STATE_12        RMB     1
  51. STATE_13        RMB     2
  52. STATE_14        RMB     2
  53. STATE_15        RMB     1
  54. STATE_16        RMB     1       ; se almacena el password de acceso al DTMF ID
  55. STATE_20        RMB     1
  56. STATE_21        RMB     1       ; se almacena el password de acceso al S-Meter Teller
  57. STATE_22        RMB     2       ; se almacena el tiempo del Squelch Tail
  58. STATE_24        RMB     1       ; se almacena el tipo de rpt. 1 = Yaesu line of Rpt.'s/0 = Full Rpt. COR
  59. STATE_25        RMB     1       ; 1 = Instant Mode on/0 = Instant Mode off
  60. STATE_26        RMB     2       ; Instant Mode PTT max. time
  61. STATE_27        RMB     2       ; Instant Mode PTT min. time
  62. STATE_28        RMB     1       ; 1 = Instant Mode ID enable/0 = Instant Mode S Teller enable
  63. STATE_98        RMB    16       ; se almacena el password de acceso al patch
  64. STATE_99        RMB    16       ; se almacena el password de acceso al sistema
  65. STATE_99_BIS    RMB    16       ; se almacena momentariamente el codigo de acceso (usado por rutina SUB_99/98 para validar el codigo, y en caso de haber un error, el uP deja el viejo codigo)
  66.  
  67. ;----------------------------------------------------------------------------
  68. ;---------------< definicion de tablas y constantes >------------------------
  69. ;----------------------------------------------------------------------------
  70.  
  71.         ORG     TABLAS
  72. TABLA_SUB
  73.     FCB     $04,$05,$06,$07,$08,$09
  74. CLEAN_TEC
  75.     FCB     $00,$00,$00,$00
  76.     FCB     $00,$00,$00,$00
  77.     FCB     $00,$00,$00,$00
  78.     FCB     $00,$00,$00,$00
  79. INITIAL_PASSWORD
  80.     FCB     $01,$02,$03,$04,$05,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  81. AUTOPATCH_PASSWORD
  82.     FCB     $01,$02,$01,$0A,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  83. PAGER_PASSWORD
  84.     FCB     $01,$01,$01,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  85. CONV_DTMF_HEX
  86.     FCB     $DD,$11,$22,$33,$44,$55,$66,$77,$88,$99,$00,$00,$00,$AA,$BB,$CC
  87.  
  88. ;****************************************************************************
  89. ;                    DEFINICIONES PARA EL PRECOMPILADOR
  90. ;****************************************************************************
  91.  
  92. ;***************************** DIRECCIONES **********************************
  93.  
  94. PIA_0           EQU     $400C
  95. PIA_1           EQU     $400D
  96. PIA_2           EQU     $400E
  97. PIA_3           EQU     $400F
  98.  
  99. ADC_ADRS        EQU     $4000
  100. DTMF_ADRS       EQU     $2000
  101.  
  102. AUDIO           EQU     $8000
  103. FIN_AUDIO       EQU     $DFFF
  104.  
  105. AUD1_ID         EQU     $8000
  106. AUD2_ID         EQU     $9F37           ; 8 segs
  107.  
  108. AUD1_METER      EQU     $9F38
  109. AUD2_METER      EQU     $AED3           ; 4 segs
  110.  
  111. AUD1_S1         EQU     $AED3
  112. AUD2_S1         EQU     $B2B9
  113. AUD2_S2         EQU     $B6A0
  114. AUD2_S3         EQU     $BA87
  115. AUD2_S4         EQU     $BE6E
  116. AUD2_S5         EQU     $C255
  117. AUD2_S6         EQU     $C63C
  118. AUD2_S7         EQU     $CA33
  119. AUD2_S8         EQU     $CE0A
  120. AUD2_S9         EQU     $D1F0
  121.  
  122. AUD1_PONCHO     EQU     $D1F0
  123. AUD2_PONCHO     EQU     $DFFF           ; 3,5 segs aprox.
  124.  
  125. ;************************* MASCARA INTERRUPCIONES ***************************
  126. ;el CC del 6809 :        -F-I----       see activa la mascara en '1'
  127.  
  128. ENABLE_IRQ      EQU     %11101111       ;habilita IRQ. (and)
  129. ENMASK_IRQ      EQU     %00010000       ;enmascara IRQ (or)
  130. ENAB_IRQ_FIRQ   EQU     %10101111
  131. ENMASK_FIRQ     EQU     %01000000
  132. ENAB_FIRQ       EQU     %10111111
  133.  
  134.  
  135. ;****************************************************************************
  136.  
  137. ;----------------------------------------------------------------------------
  138. ;----------------------< vectores de interrupcion >--------------------------
  139. ;----------------------------------------------------------------------------
  140.  
  141. ;en orden de prioridad :
  142.  
  143. VEC_RESET       EQU     $FFFE           ; RESET request
  144. VEC_IRQ         EQU     $FFF8           ; IRQ request
  145.  
  146.         ORG     VEC_RESET
  147.         FDB     _RESET
  148.  
  149.         ORG     VEC_IRQ
  150.         FDB     _IRQ
  151.         
  152. ;****************************************************************************
  153. ;                       INICIALIZACION DEL HARDWARE
  154. ;                       (comienzo del programa)
  155. ;****************************************************************************
  156.         ORG     EPROM
  157. _RESET
  158.  
  159.     ;---------------- inicializacion del STACK y variables --------------
  160.  
  161.     LDS     #FIN_RAM
  162.  
  163.     LDU     #STACK_U
  164.  
  165.     ;----------------- inicializacion de la PIA 6821 --------------------
  166.  
  167.     
  168.     CLR     PIA_1           ;limpio el control register A
  169.     CLR     PIA_3           ;limpio el control register B
  170.  
  171.     LDA     #%01011111      
  172.     STA     PIA_0           ;seteo el port A como output, menos PA5 y PA7 
  173.     
  174.     LDA     #%11111111
  175.     STA     PIA_2           ;seteo el port B como output
  176.  
  177.     LDA     #%00010101      ;seteo el control register A mas la interrupcion del clock de 100Hz, mas CA1 (el bit 1=1) que es la entrada del COR.
  178.     STA     PIA_1
  179.  
  180.     LDA     #%00000100      ;seteo el control register B
  181.     STA     PIA_3
  182.     
  183.     ;a partir de aca la PIA_0 es la direccion del portA
  184.     ;                la PIA_2 es la direccion del portB
  185.  
  186.     ; ---------------- SETEA LA INTERRUPCION DE CB2 (PTT) --------------
  187.  
  188.     LDA     #%00001100      ; pongo bit3 en 1 para activar el CB2 como interrupt input, active on rising edge
  189.     STA     PIA_3
  190.     LDA     PIA_2
  191.  
  192.     ; ---------------- SETEA LA INTERRUPCION DE CB1 (DTMF) -------------
  193.  
  194.     LDA     PIA_3
  195.     ORA     #%00000010      ; pongo bit1 en 1 y bit0 en 0. queda el IRQ desactivado y el flag sube y baja con la entrada de CB1
  196.     STA     PIA_3
  197.     LDA     PIA_2
  198.     ; ---------------- INICIALIZO VALORES DE VARIABLES (si se pide) ----
  199.  
  200.     LDA     PIA_0
  201.     ORA     #%01000000      ; desabilito momentaneamente rpt.
  202.     STA     PIA_0
  203.  
  204.     ANDCC   #ENABLE_IRQ
  205.     LDA     #$00
  206.     STA     PRESSED_KEY
  207.     
  208.     LDX     #0500
  209.     STX     WAIT_TIME
  210.  
  211.     LDA     PIA_1
  212.     ORA     #%00011100      ;seteo el control register A
  213.     STA     PIA_1
  214.  
  215.     LDA     PIA_3
  216.     ORA     #%00000011      ; hago que el cic9203 llame a interrupcion _IRQ
  217.     STA     PIA_3
  218.     LDA     PIA_2
  219. WAIT_BOOT        
  220.     LDA     PRESSED_KEY     ; no necesito ir a DTMF1_TECLADO, por que al ejecutarce un _IRQ, en el cual esta mandando datos el cic9203, la rutina los introduce en PRESSED_KEY.
  221.     CMPA    #$0E
  222.     BEQ     FULL_RESET      ; si al encender sosengo oprimido la key B, entonces me inicializa nuevamente el equipo
  223.     
  224.     LDD     #$0000
  225.     CMPD    WAIT_TIME
  226.     BNE     WAIT_BOOT
  227.     LBRA    NO_FULL_RESET
  228.  
  229. FULL_RESET      ; aqui viene cuando realiza un BOOT-UP, pedido por SUB_23, por ejemplo        
  230.     LDX     #INITIAL_PASSWORD
  231.     LDY     #STATE_99
  232.     LDB     #16
  233.     JSR     STRINGCOPY      ; codigo de acceso
  234.     
  235.     LDX     #AUTOPATCH_PASSWORD
  236.     LDY     #STATE_98
  237.     LDB     #16
  238.     JSR     STRINGCOPY      ; codigo del AUTOPATCH
  239.  
  240.     LDX     #PAGER_PASSWORD
  241.     LDY     #STATE_04
  242.     LDB     #16
  243.     JSR     STRINGCOPY      ; codigo del PAGER
  244.     
  245.     LDA     #$08
  246.     STA     STATE_16        ; codigo de acceso default al DTMF ID
  247.     
  248.     LDA     #$03
  249.     STA     STATE_21        ; codigo de acceso default al S-Meter Teller 
  250.  
  251.     LDD     #$4650          ; timpo entre ID's con rpt. QAP, es de 3 min (18000 clocks)
  252.     STD     STATE_13
  253.  
  254.     LDD     #$2904          ; tiempo entre ID's al activar rpt, es de 1,25 min (10500 clocks)
  255.     STD     STATE_14
  256.     
  257.     LDD     #$3A98          ; tiempo de anti-poncho (2,5 min/15000 clocks)
  258.     STD     STATE_10
  259.  
  260.     LDD     #0100
  261.     STD     STATE_22        ; tiempo de Squelch Tail
  262.  
  263.     LDD     #0050
  264.     STD     STATE_26        ; tiempo max. del PTT de Instant Mode
  265.     
  266.     LDD     #0003
  267.     STD     STATE_27        ; tiempo min. del PTT de Instant Mode
  268.     
  269.     LDA     #$01
  270.     STA     STATE_00
  271.     STA     STATE_05
  272.     STA     STATE_09        
  273.     STA     STATE_11
  274.     STA     STATE_12
  275.     STA     STATE_15
  276.     STA     STATE_20
  277.     STA     STATE_24        
  278.  
  279.     LDA     #$00
  280.     STA     STATE_01
  281.     STA     STATE_02
  282.     STA     STATE_03
  283.     STA     STATE_06
  284.     STA     STATE_07
  285.     STA     STATE_08
  286.     STA     STATE_28
  287.     STA     STATE_25
  288.     
  289. NO_FULL_RESET
  290.     LDA     PIA_3
  291.     ANDA    #%11111110      ; hago que el cic9203 no llame a interrupcion _IRQ
  292.     STA     PIA_3
  293.     LDA     PIA_2
  294.     
  295.     LDA     #$00
  296.     STA     PATCH
  297.     ;----------------- FIN DE INICIALIZACIONES --------------------------
  298.     
  299.     LDA     #$02
  300.     STA     BUFFER          ; para resetear el timer que este activado (ID o Anti-Poncho), esto se realiza al ir a TIME_OUT
  301.     
  302.     LDD     STATE_13
  303.     STD     WAIT_TIME
  304.     JSR     SAY_ID
  305. START        
  306.     LDA     PIA_1
  307.     ORA     #%00011100      ;seteo el control register A
  308.     STA     PIA_1
  309.     
  310.     JSR     CHANGE_PIA
  311.     JSR     PASS_SEL
  312. DO
  313.     LDA     PIA_1
  314.     ANDA    #%11110111      ;seteo el control register A, (para que no funcione el time_out, esto es CA2 desactivada 100Hz)
  315.     STA     PIA_1
  316.     
  317.     LDA     PIA_0
  318.     ORA     #%01000000      
  319.     STA     PIA_0           ; desactivo momentariamente a la RPT, luego CHANGE_PIA me lo reactiva (o no) al ir a START (quedo claro no?)
  320.  
  321.     LDB     #02
  322.     JSR     DTMF_TECLADO    ; le pido que me lea 2 bytes del cic9203
  323.     LDA     ABORT_MODE
  324.     CMPA    #$0B
  325.     BEQ     START
  326.     CMPA    #$0C
  327.     BEQ     DO              ; checkeo los distintos tipos de abort's 
  328.     
  329.     JSR     SUB_00
  330. ;        JSR     SUB_01
  331. ;        JSR     SUB_02
  332.     JSR     SUB_03
  333.     JSR     SUB_04
  334.     JSR     SUB_05
  335.     JSR     SUB_06
  336.     JSR     SUB_07
  337.     JSR     SUB_08
  338.     JSR     SUB_09
  339.     JSR     SUB_10
  340.     JSR     SUB_11
  341.     JSR     SUB_12
  342.     JSR     SUB_13
  343.     JSR     SUB_14
  344.     JSR     SUB_15
  345.     JSR     SUB_16
  346.     JSR     SUB_17
  347.     JSR     SUB_18
  348.     JSR     SUB_19
  349.     JSR     SUB_20
  350.     JSR     SUB_21
  351.     JSR     SUB_22
  352.     JSR     SUB_23
  353.     JSR     SUB_24
  354.     JSR     SUB_25
  355.     JSR     SUB_26
  356.     JSR     SUB_27
  357.     JSR     SUB_28
  358.     JSR     SUB_98
  359.     JSR     SUB_99
  360.     
  361.     LDA     ABORT_MODE
  362.     CMPA    #$0B
  363.     LBEQ    START           ; si como resultado a alguna de las sub's se le entra una tecla de abort, entonces el sistema sale del "loop do"
  364.     LBRA    DO
  365.  
  366. ; ***************************************************************************
  367.  
  368. ; ----- Subrutinas ----------------------------------------------------------
  369.  
  370. ; ***************************************************************************
  371. ; RUTINA PARA MANEJO DEL TECLADO + MANEJO DE TECLAS RETENIDAS.        
  372. ; DTMF_TECLADO()
  373. ; el resultado de la lectura se almacena en PRESSED_KEY, este puede ser entre
  374. ; $00 y $0F
  375. ; no se requiere pasar ningun tipo de parametros.
  376. ; en "B" debe ir la cantidad de caracteres que se quieren leer.
  377. ; si lo leido del cic9203 es = $0B o es = $0C, entonces quiere decir que el 
  378. ; usuario oprimio "*" o "#" respectivamente, y por lo tanto debe abortar.
  379. ; si esperando una lectura del DTMF, se llega a producir un disable de la 
  380. ; rpt. (PA7=0), sale de la rutina poniendo a ABORT_MODE en $0B y PRESSED_KEY 
  381. ; en $0B.
  382. ; ***************************************************************************
  383. DTMF_TECLADO        
  384.     PSHS    A,B,X,Y
  385.                 ; aqui se acumula la cantidad de caracteres leidos
  386.     LDY     #PRESSED_KEY    ; limpio el lugar donde debe ir el string de PRESSED_KEY
  387.     LDX     #CLEAN_TEC
  388.     JSR     STRINGCOPY
  389.     EXG     X,Y             ; dejo en "X" el address de PRESSED_KEY, para luego irlo incrementando
  390. DIGIT_LOOP
  391.     LDA     PIA_3
  392.     STA     VAR_1           ; lo realizo, para que _IRQ pueda forzar una lectura de DTMF en el caso de que este en modo pager, y haya parado la reproducion
  393.     JSR     TIME_OUT        ; llamo a la rutina, para que checkee si se debe activar el anti-poncho
  394.     
  395.     PSHS    B
  396.     LDB     PIA_0
  397.     ANDB    #$80
  398.     CMPB    #$80
  399.     PULS    B
  400.     BNE     SALIR           ; si esperando la lectura del DTMF se llega a producir un disable de la rpt. (PA7=0), sale de la rutina poniendo a ABORT_MODE en $0B y PRESSED_KEY en $0B
  401.     
  402.     LDA     VAR_1
  403.     ANDA    #$80
  404.     CMPA    #$80
  405.     BNE     DIGIT_LOOP      ; checkeo si viene la interrupcion correcta (la del cic9203 obiamente, que mierda puedo estar esperando!!!)
  406.     
  407.     LDA     PIA_2           ; reseteo el irq de la pia mediante una lectura de la misma.
  408.     LDA     DTMF_ADRS
  409.     ANDA    #$0F            ; solo tomo los 4 bits que utiliza el CIC9203 (por si las moscas)
  410.     STA     ,X        
  411.     LEAX    1,X        
  412.     
  413.     STA     ABORT_MODE      ; guardo el ultimo digito (que en caso de abort es el digio del tipo de abort, para que luego se sepa se volver a DO o a START)
  414.     CMPA    #$0B            ; "*"
  415.     BEQ     END_DTMF
  416.     CMPA    #$0C            ; "#"
  417.     BEQ     END_DTMF        ; si el usuario oprime alguna de las dos teclas de abort "*" o "#", ejecuta el abort
  418.     
  419.     DECB        
  420.     CMPB    #$00
  421.     BNE     DIGIT_LOOP      ; si llego a 0 "B", entonces me voy (ya que se supone que leyo la canidad de bytes que debia, en teoria!!!)
  422. END_DTMF
  423.     PULS    A,B,X,Y        
  424.     RTS     ; -------------------------------- RTS ----------------------
  425. SALIR           
  426.     LDA     #$0B
  427.     STA     PRESSED_KEY
  428.     STA     ABORT_MODE
  429.     BRA     END_DTMF
  430.     ; end ---------------------------------------------------------------        
  431.  
  432. ; ***************************************************************************
  433. ; RUTINA PARA COPIAR UN STRING.
  434. ; STRINGCOPY()
  435. ; X es el puntero del string a leer, Y es el puntero del lugar de escritura
  436. ; y B es la contidad de bytes a copiar.
  437. ; ***************************************************************************
  438. STRINGCOPY
  439.     PSHS    A,B,X,Y
  440.     STB     VAR_0
  441.     LDB     #$00
  442. STRC
  443.     INCB
  444.     LDA     ,X
  445.     STA     ,Y
  446.     LEAX    1,X
  447.     LEAY    1,Y
  448.     CMPB    VAR_0
  449.     BNE     STRC
  450.     
  451.     PULS    A,B,X,Y
  452.     RTS
  453.     ; end ---------------------------------------------------------------        
  454.  
  455. ; ***************************************************************************
  456. ; RUTINA DE MANEJO DE INTERRUPCIONES.
  457. ; _IRQ()
  458. ; * maneja el contador de 100Hz que va incrementando a WAIT_TIME
  459. ; finalmente no importa el tipo de interrupcion se lee PIA_0 y PIA_2
  460. ; ***************************************************************************
  461. _IRQ        
  462.     LDB     PIA_3
  463.     ANDB    #$80
  464.     CMPB    #$80
  465.     BEQ     DTMF_IRQ
  466.     
  467.     LDA     PIA_1
  468.     ANDA    #$40
  469.     CMPA    #$40
  470.     BEQ     WAIT_ON
  471.     BRA     END_IRQ
  472.     
  473. WAIT_ON
  474.     LDD     WAIT_TIME
  475.     CMPD    #$0000
  476.     BEQ     END_IRQ         ; si es cero no le sigo restando, ya que daria la vuelta.
  477.  
  478.     SUBD    #01
  479.     STD     WAIT_TIME
  480.     BRA     END_IRQ
  481.  
  482. DTMF_IRQ
  483.     LDA     PIA_2
  484.     ANDA    #$02
  485.     CMPA    #$00
  486.     BEQ     READ_ON         ; si no estaba reproduciendo audio, entonces es por que me llaman del BOOT (principio del programa), de lo contrario estoy reproduciendo audio, en modo pager, y la rpt. estaba desactivada. debo interrumpir la reproduccion.
  487.     
  488.     LDA     PIA_0
  489.     ANDA    #$80
  490.     CMPA    #$80
  491.     BNE     END_IRQ         ; si la rpt. no es peteteada, aunque entre un DTMF no le doy bola
  492.  
  493.     STX     OFS_TABLA       ; lo realizo para interrumpir la repro.
  494.     LDA     #$80
  495.     STA     VAR_1           ; lo realizo para que PASS_PAGER me lea este digito del DTMF que acaba de interrumpir la repro.
  496.     BRA     END_IRQ
  497. READ_ON        
  498.     JSR     DTMF1_TECLADO
  499.     BRA     END_IRQ
  500.  
  501.     ; ------------------------ TIPOS DE SALIDAS ------------------------
  502. END_IRQ
  503.     LDA     PIA_0
  504.     LDA     PIA_2
  505.     RTI
  506.     ; end ---------------------------------------------------------------        
  507.     
  508. ; ***************************************************************************
  509. ; RUTINA QUE LEE EL CIC9203 (SIN PARAR LA EJECUCION DEL uP)
  510. ; DTMF1_TECLADO()
  511. ; esta rutina lee la tecla actualmente oprimida, y lo pone en PRESSED_KEY.
  512. ; si no hay ninguna tecla oprimida, limpia los 16 char's de PRESSED_KEY, y 
  513. ; sale de la rutina.
  514. ; si en medio de una lectura de DTMF, se llega a producir un disable de la 
  515. ; rpt. (PA7=0), sale de la rutina poniendo a PRESSED_KEY en $0B.
  516. ; ***************************************************************************
  517. DTMF1_TECLADO        
  518.     PSHS    A,B,X
  519.     LDA     #$00            ; aqui se pone la tecla oprimida        
  520.     LDB     PIA_0
  521.     ANDB    #%00100000
  522.     CMPB    #%00100000
  523.     BNE     END_DT_RE
  524.  
  525.     LDA     PIA_2           ; reseteo el irq de la pia
  526.     LDA     DTMF_ADRS
  527.     ANDA    #$0F            ; solo tomo los 4 bits que utiliza el CIC9203 (por si las moscas)
  528.     
  529.     LDB     PIA_0
  530.     ANDB    #$80
  531.     CMPB    #$80
  532.     BEQ     END_DT_RE
  533.     LDA     #$0B
  534. END_DT_RE
  535.     STA     PRESSED_KEY
  536.  
  537.     PULS    A,B,X
  538.     RTS
  539.     ; end ---------------------------------------------------------------        
  540.  
  541.  
  542. ; ***************************************************************************
  543. ; CHECKEA A QUE CODIGO DE ACCESO EL USUARIO QUIERE ACCEDER.
  544. ; PASS_SEL()
  545. ; no requiere ningun parametro externo. compara el codigo entrado, con los 
  546. ; prefijos de cada codigo, que se dan a continuacion.
  547.     * "A" + codigo de AutoPatch                             (------------) se utiliza la ayuda de PASS_PATCH
  548.     * "C" + codigo de accesso al sistema de control         (PASS_CONTROL)
  549.     * "" + codigo para ID de rpt.                           (SAY_ID)
  550.     * "" + codigo para S-Meter Teller de rpt.               (S_TELLER)
  551. ; si esta en modo PAGER, entonces primero ejecuta la rutina PASS_PAGER, y 
  552. ; luego lo mencionado arriba.
  553. ; ***************************************************************************
  554. PASS_SEL
  555.     PSHS    A,B,X,Y
  556. SEL_LOOP
  557.     LDA     STATE_03
  558.     CMPA    #$01
  559.     BNE     MODE_20                 ; si no esta en modo PAGER, no ejecuto la rutina PASS_PAGER
  560.     JSR     PASS_PAGER
  561. MODE_20        
  562.     LDB     #$01
  563.     JSR     DTMF_TECLADO
  564.     
  565.     LDA     PRESSED_KEY
  566.     CMPA    #$0F
  567.     BEQ     CODE_1          ; si es "C" va a ejecutar a PASS_CONTROL
  568.     
  569.     LDB     STATE_00
  570.     CMPB    #$00
  571.     BEQ     DONT_WORK       ; si la RPT esta fuera de funcionamiento, entonces solo le doy bola al cambio de parametros
  572.  
  573.     CMPA    #$0D
  574.     BEQ     CODE_2          ; si es "A" va a ejecutar a PASS_PATCH
  575.     
  576.     CMPA    STATE_16        
  577.     BEQ     CODE_3          ; si es el codigo de la ID de la rpt, va a ejecutar a SAY_ID (siempre que STATE_15=1)
  578.     
  579.     CMPA    STATE_21        
  580.     BEQ     CODE_4          ; si es el codigo del S-Meter Teller  va a ejecutar a S_TELLER (siempre que STATE_20=1)
  581. DONT_WORK        
  582.     LDA     STATE_RPT
  583.     CMPA    #$01
  584.     BEQ     MODE_20         ; si la rpt. no fue desactivada, siguo viendo si me piden hacer algo mas. por el contrario, si la rpt. se desactivo, voy a PASS_PAGER, para ver si cuando se vuelve a activar
  585.     BRA     SEL_LOOP      
  586.     
  587. CODE_1
  588.     JSR     PASS_CONTROL
  589.     LDA     PRESSED_KEY
  590.     CMPA    #$0B
  591.     BEQ     MODE_20
  592.     CMPA    #$0C
  593.     BEQ     MODE_20                 ; si pone # o * comienzo todo de nuevo
  594.     BRA     END_SEL                 ; si entro correctamente el codigo de acceso, sigo adelante, para que el usuario pueda cambiar los parametros
  595.  
  596. CODE_2
  597.     LDA     STATE_05
  598.     CMPA    #$01
  599.     BNE     MODE_20                 ; si no esta permitido activar el patch salgo
  600.  
  601.     JSR     PASS_PATCH
  602.     LDA     ABORT_MODE
  603.     CMPA    #$0B
  604.     BEQ     MODE_20
  605.     CMPA    #$0C
  606.     BEQ     MODE_20                 ; si pone # o * comienzo todo de nuevo
  607.     
  608.     LDA     PIA_2
  609.     ORA     #$03                    ; indica que accione el patch y mantenga a la RPT en transmicion (en RPT Yaesu)
  610.     STA     PIA_2                   ; si entro correctamente el codigo de acceso, acciono el PATCH
  611.  
  612.     LDA     #$01
  613.     STA     PATCH                   ; aviso al resto del sistema que el patch esta activado
  614. PATCH_LOOP        
  615.     LDB     #$01
  616.     JSR     DTMF_TECLADO
  617.     LDA     PRESSED_KEY
  618.     CMPA    #$0C
  619.     BEQ     MODE_21                 ; si oprimo # salgo del modo patch y lo desactivo
  620.     
  621.     LDA     STATE_03
  622.     CMPA    #$01
  623.     BNE     PATCH_LOOP              ; si no estoy en modo pager vuelvo a PATCH_LOOP a leer otro digito del DTMF
  624.  
  625.     LDA     STATE_RPT
  626.     CMPA    #$01
  627.     BEQ     PATCH_LOOP              ; si estoy en modo pager, pero no se desactivo la rpt. voy a PATCH_LOOP a leer otro digito del DTMF
  628.     JSR     PASS_PAGER              ; si se desactivo la rpt. entonces voy a leer nuevamente el codigo del pager
  629.     BRA     PATCH_LOOP
  630. MODE_21
  631.     LDA     PIA_2
  632.     ANDA    #%11111100              ; indica que desaccione el patch
  633.     STA     PIA_2                   ; desacciono el modo patch
  634.     
  635.     LDA     #$00
  636.     STA     PATCH                   ; salgo del modo patch
  637.     
  638.     LDD     STATE_10
  639.     STD     WAIT_TIME               ; reinicializo el timer
  640.     LBRA    MODE_20                 ; luego comienzo todo de nuevo
  641.  
  642. CODE_3
  643.     LDA     STATE_15
  644.     CMPA    #$01
  645.     LBNE    MODE_20
  646.     JSR     SAY_ID
  647.     LBRA    MODE_20
  648.  
  649. CODE_4
  650.     LDA     STATE_20        
  651.     CMPA    #$01
  652.     LBNE    MODE_20
  653.     JSR     S_TELLER
  654.     LBRA    MODE_20
  655. END_SEL
  656.     PULS    A,B,X,Y
  657.     RTS
  658.     ; end ---------------------------------------------------------------        
  659.  
  660. ; ***************************************************************************
  661. ; CHECKEA SI PASA EL CODIGO DE ACCESO.
  662. ; PASS_CONTROL()
  663. ; no requiere ningun parametro externo. compara el codigo entrado, con el 
  664. ; guardado en STATE_99. el control del uP no se queda en la rutina.
  665. ; si se ejecuta un # o * sale de la rutina, y luego PASS_SEL lo utiliza para
  666. ; no permitir el ingreso con el fin de cambiar datos.
  667. ; el fin de codigo esta determinado por un $0C en STATE_99.
  668. ; ***************************************************************************
  669. PASS_CONTROL    
  670.     PSHS    A,B,X,Y
  671. PASS1_LOOP        
  672.     LDY     #STATE_99
  673. PASS_LOOP
  674.     LDB     #$01
  675.     JSR     DTMF_TECLADO
  676.     
  677.     LDA     PRESSED_KEY
  678.     CMPA    #$0B
  679.     BEQ     END_CONTROL
  680.     CMPA    #$0C
  681.     BEQ     END_CONTROL             ; si pone # o * salgo y por lo tanto vuelvo a PASS_SEL
  682.  
  683.     CMPA    ,Y
  684.     BNE     PASS1_LOOP
  685.     LEAY    1,Y
  686.     
  687.     LDA     ,Y
  688.     CMPA    #$0C                    ; cuando aparece un "#" ($0C) quiere decir que termino el codigo de acceso        
  689.     BNE     PASS_LOOP
  690. END_CONTROL        
  691.     PULS    A,B,X,Y
  692.     RTS
  693.     ; end ---------------------------------------------------------------        
  694.  
  695. ; ***************************************************************************
  696. ; CHECKEA SI PASA EL CODIGO DEL PAGER.
  697. ; PASS_PAGER()
  698. ; no requiere ningun parametro externo. compara el codigo entrado, con el 
  699. ; guardado en STATE_04. el control del uP se queda en la rutina. solo sale
  700. ; cuando se ejecuta el codigo correcto. en tal caso se habilita la rpt. y se
  701. ; sale. si la rpt. esta en modo disable STATE_00=1, no la activa.
  702. ; el fin de codigo esta determinado por un $0C en STATE_04.
  703. ; ***************************************************************************
  704. PASS_PAGER
  705.     PSHS    A,B,X,Y
  706. PASS1_PAGER        
  707.     LDY     #STATE_04
  708. PASS2_PAGER
  709.     LDB     #$01
  710.     JSR     DTMF_TECLADO
  711.     
  712.     LDA     PRESSED_KEY
  713.     CMPA    #$0B
  714.     BEQ     PASS1_PAGER
  715.     CMPA    #$0C
  716.     BEQ     PASS1_PAGER             ; si pone # o * salgo y por lo tanto vuelvo a PASS_SEL
  717.  
  718.     CMPA    ,Y
  719.     BNE     PASS1_PAGER
  720.     LEAY    1,Y
  721.     
  722.     LDA     ,Y
  723.     CMPA    #$0C                    ; cuando aparece un "#" ($0C) quiere decir que termino el codigo de acceso        
  724.     BNE     PASS2_PAGER
  725.     
  726.     LDA     STATE_00
  727.     CMPA    #$01
  728.     BNE     END_PAGER       ; si esta en modo disable STATE_00=1, no activa la rpt.
  729.  
  730. CHECK_END       ; checkeo que haya sesado el ultimo tono DTMF, antes de activar la rpt.
  731.     LDA     PIA_0
  732.     ANDA    #%00100000
  733.     CMPA    #%00100000
  734.     BEQ     CHECK_END       ; mientras el ulitmo tono no termine, sigo esperando
  735.  
  736.     LDA     PIA_0           ; activo momentariamente a la rpt. luego lo desactiva _IRQ, si se desactiva la rpt.
  737.     ANDA    #%10111111      
  738.     STA     PIA_0           
  739.     
  740.     LDA     #$01
  741.     STA     STATE_RPT       ; me pongo en modo rpt. activate, ya que es la verdad y a mi no me gusta mentir!!! (ademas no lo puedo hacer despues, ya que en modo pager la rutina SAY_ID debe saber el estado de la rpt para parar la repro o no.
  742.         
  743.         ; ---------------------- manejo STATE_14 en modo pager ------                                
  744.     LDA     STATE_12
  745.     CMPA    #$01
  746.     BNE     NO1_SAY         ; si esta desactivado el phone-id, se calla la boca
  747.     
  748.     LDD     STATE_14
  749.     CMPD    STATE_13        ;#$0000
  750.     BEQ     NO1_SAY         ; si el valor es cero, debe quedar desactivado
  751.     
  752.     LDD     WAIT_TIME
  753.     CMPD    STATE_14
  754.     BHI     NO1_SAY
  755.     JSR     SAY_ID          ; si se activa la rpt. despues de xxxx seg. la identifica, y luego comienza a contar el antiponcho 
  756. NO1_SAY            
  757.         ; ------------------ fin manejo STATE_14 en modo pager ------                                
  758.     
  759.     LDD     STATE_10
  760.     STD     WAIT_TIME       ; comienzo nuevamente a contar el timer del anti-poncho
  761. END_PAGER        
  762.     PULS    A,B,X,Y
  763.     RTS
  764.     ; end ---------------------------------------------------------------        
  765.     
  766. ; ***************************************************************************
  767. ; RUTINA PARA SETEAR LA PIA EN BASE A LOS DATOS DE LAS VARIBLES STATE_xx.
  768. ; CHANGE_PIA()
  769. ; la rutina utiliza los parametros de las varibles STATE_xx para setear los
  770. ; 2 port's de la pia (PORT A y B).
  771. ; actualmente genera lo siguiente:
  772.     * PB0 manejado por STATE_05 y por rutina PASS_SEL y PASS_PATCH (patch)
  773.     * PB1 por ahora no se maneja [manejado por (tx_state)]
  774.     * PB3 manejado por STATE_06 (user_1)
  775.     * PB4 manejado por STATE_07 (user_2)
  776.     * PB5 manejado por STATE_08 (user_3)
  777.     
  778.     * PA6 manejado por STATE_00 (tx_disable) (si el pager o el patch esta activado, entonces no lo toco)
  779.     * PA7 lectura de estado de repetidora (no lo maneja esta rutina)
  780. ; ***************************************************************************
  781. CHANGE_PIA
  782.     PSHS    A,B,X,Y
  783.     
  784.     LDA     STATE_03
  785.     CMPA    #$01
  786.     BEQ     PAGER_ON        ; si el pager esta activado me voy a la mierda (pager_on)
  787.  
  788.     LDA     PATCH
  789.     CMPA    #$01
  790.     BEQ     PAGER_ON        ; si el patch esta activado me voy a la mierda (pager_on)
  791.  
  792.     LDA     STATE_00
  793.     ASLA
  794.     ASLA
  795.     ASLA
  796.     ASLA
  797.     ASLA
  798.     ASLA
  799.     ANDA    #$40
  800.     ADDA    #$40            ; equivale a un hex-inverter
  801.     ANDA    #$40
  802.     LDB     PIA_0
  803.     ANDB    #%10111111
  804.     STB     VAR_0
  805.     ADDA    VAR_0
  806.     STA     PIA_0           ; maneja el PA6 (enable/disable RPT TX)
  807.     
  808. PAGER_ON
  809.     LDA     STATE_06
  810.     ANDA    #$01
  811.     ASLA
  812.     ASLA
  813.     ASLA
  814.     LDB     STATE_07
  815.     ANDB    #$01
  816.     ASLB
  817.     ASLB            ; chechear, (hay que correrlo hacia msb 1 bit)
  818.     ASLB
  819.     ASLB
  820.     STB     VAR_0
  821.     ADDA    VAR_0
  822.     LDB     STATE_08
  823.     ANDB    #$01
  824.     ASLB
  825.     ASLB
  826.     ASLB            ; chechear, (hay que correrlo hacia msb 1 bit)
  827.     ASLB
  828.     ASLB
  829.     STB     VAR_0        
  830.     ADDA    VAR_0
  831.     
  832.     LDB     PIA_2
  833.     ANDB    #%11000111
  834.     STB     VAR_0
  835.     ADDA    VAR_0
  836.     STA     PIA_2           ; maneja los PB3, PB4, PB5 (USER 1-3 outputs)
  837.  
  838.     PULS    A,B,X,Y        
  839.     RTS
  840.     ; end ---------------------------------------------------------------        
  841.  
  842. ; ***************************************************************************
  843. ; RUTINA QUE MANEJA LA DESACT. DEL ANTI-PONCHO Y LA ACT. DEL ID
  844. ; TIME_OUT()
  845. ; esta rutina se basa en que cuando se activa la rpt. _IRQ pone en WAIT_TIME
  846. ; un numero de tiempo determinado, que luego mediante los interupts de 100Hz
  847. ; va disminuyendo hasta llegar a cero. cuando llega, y esta rutina checkea que
  848. ; el anti-poncho esta activado, y ademas la rpt. sigue activada, entonces la
  849. ; desactiva. la unica forma de reactivarla es mediante dejar de transmitir, y
  850. ; luego comenzar a transmitir nuevamente.
  851. ; si WAIT_TIME llega a cero, y la rpt. esta desactivada, entonces llama a 
  852. ; SAY_ID para que identifique a la rpt, luego carga el timer para que 
  853. ; comience a contar nuevamente.
  854. ; ***************************************************************************
  855. TIME_OUT
  856.     PSHS    A,B,X,Y
  857.     ; -------------------------------------------------------------------
  858.     ; Ver si cambio de estado (TX a QAP o viceversa) y accionar en base a ello
  859.     LDA     PIA_0
  860.     ANDA    #$80
  861.     CMPA    BUFFER
  862.     LBEQ    END_TIME
  863.     STA     BUFFER
  864.     
  865.     CMPA    #$00
  866.     BEQ     ID_CHECK        
  867.     
  868.     JSR     CHANGE_PIA      ; lo llamo para que si se desactivo la rpt por anti-poncho, ahora la reactive
  869.     LDA     STATE_03
  870.     CMPA    #$01
  871.     LBEQ    END_TIME        ; si esta el pager activado, entonces se maneja todo desde PASS_PAGER, no desde aqui.
  872.     
  873.     LDA     PATCH
  874.     CMPA    #$01
  875.     BEQ     NO_SAY          ; si el patch esta andando, entonces no debe haber anti-poncho, etc
  876.  
  877.     LDA     STATE_12
  878.     CMPA    #$01
  879.     BNE     NO_SAY          ; si esta desactivado el phone-id, se calla la boca
  880.     
  881.     LDD     STATE_14
  882.     CMPD    STATE_13        ;#$0000
  883.     BEQ     NO_SAY          ; si el valor es cero, debe quedar desactivado
  884.     
  885.     LDD     WAIT_TIME
  886.     CMPD    STATE_14
  887.     BHI     NO_SAY
  888.     JSR     SAY_ID          ; si se activa la rpt. despues de xxxx seg. la identifica, y luego comienza a contar el antiponcho 
  889. NO_SAY            
  890.     LDX     STATE_10        ; inicializo el tiempo del anti-ponchus
  891.     STX     WAIT_TIME
  892.     
  893.     LDA     #$01
  894.     STA     STATE_RPT
  895.     LBRA    END_TIME
  896.  
  897.  
  898. ID_CHECK
  899.     LDA     STATE_25
  900.     CMPA    #$00
  901.     BEQ     CHECK_GOON      ; si esta desactivado el Instant Mode, sigo la rutina sin detenerme a analizar
  902.     
  903.     LDA     STATE_00
  904.     CMPA    #$00
  905.     BEQ     CHECK_GOON      ; si esta fuera de funcionamiento la RPT, entonces no debe funcionar el Instant Mode
  906.  
  907.     LDD     STATE_10
  908.     SUBD    STATE_26
  909.     CMPD    WAIT_TIME
  910.     BHI     CHECK_GOON      ; si la rpt. estuvo encendida mas que el tiempo maximo de Instant Mode, sigue y no lo ejecuta
  911.  
  912.     LDD     STATE_10
  913.     SUBD    STATE_27
  914.     CMPD    WAIT_TIME
  915.     BLS     CHECK_GOON      ; si el pulso de PTT no puede ser menor que state_27, no ejecuto Instant Mode (ya que indica que acabo de salir de reproducir algo, o que es un ruido muy corto, etc.)
  916.  
  917.     LDA     STATE_28
  918.     CMPA    #$00
  919.     BEQ     TYPE_0
  920.             ; ejecuto un SAY_ID
  921.     JSR     SAY_ID
  922.     BRA     CHECK_GOON
  923. TYPE_0                  ; ejecuto un S_Teller
  924.     JSR     S_TELLER
  925. CHECK_GOON        
  926.     LDX     WAIT_TIME
  927.     LDD     STATE_22
  928.     STD     WAIT_TIME
  929. ID_TAIL        
  930.     LDA     PIA_0
  931.     ANDA    #$80
  932.     CMPA    #$80
  933.     BNE     TAIL_OUT        ; si se reactiva la rpt. dentro de este tiempo llamo a PONCH_CHECK, para que carge el timer y los datos correspondientes
  934.     
  935.     STX     WAIT_TIME       ; reestablezo el timer
  936.     STA     BUFFER
  937.     BRA     END_TIME
  938. TAIL_OUT
  939.     LDD     WAIT_TIME
  940.     CMPD    #$0000
  941.     BNE     ID_TAIL
  942.     
  943.     STX     WAIT_TIME       ; reestablezo el timer
  944.     
  945.     LDA     STATE_03
  946.     CMPA    #$01
  947.     BEQ     DIS             ; si no esta el pager activado, no desactivo la rpt.
  948.     
  949.     LDA     STATE_24
  950.     CMPA    #$00
  951.     BEQ     DIS             ; si la rpt. esta en modo "No Yaesu" (modo COR), entonces debe desactivar la RPT
  952.     BRA     SEG_ID
  953. DIS
  954.     LDA     PATCH
  955.     CMPA    #$01
  956.     BEQ     SEG_ID          ; si el patch esta en uso, entonces no desactivo la RPT
  957.  
  958.     LDA     PIA_0
  959.     ORA     #%01000000      
  960.     STA     PIA_0           ; desactivo momentariamente a la RPT, luego CHANGE_PIA me lo reactiva (o no) al ir a START (quedo claro no?)
  961. SEG_ID        
  962.     LDA     STATE_RPT
  963.     CMPA    #$00
  964.     BEQ     END_TIME
  965.  
  966.     LDX     STATE_13        ; inicializo el tiempo del ID, siempre y cuando la STATE_RPT=1 , ya que sino no inicializo nuevamente el timer (esto se puede dar solamente en el modo pager, cuando desaprece una portadora que no mando el codigo del pager).
  967.     STX     WAIT_TIME
  968.     LDA     #$00
  969.     STA     STATE_RPT
  970. END_TIME        
  971.     ; -------------------------------------------------------------------
  972.     
  973.  
  974.     LDD     WAIT_TIME
  975.     CMPD    #$0000
  976.     LBNE    END_TIME_OUT            ; si no es igual a cero, me voy ya que no debe ejecutar ni anti-poncho ni ID
  977.         
  978.     LDA     STATE_RPT
  979.     CMPA    #$00
  980.     BEQ     ID_OUT                  ; si se desactivo la rpt voy a ver si debo mandar el ID
  981.     
  982.     LDA     STATE_09
  983.     CMPA    #$01
  984.     BNE     END_TIME_OUT            ; checkeo si esta activado o no el anti-poncho
  985.     
  986.     LDA     STATE_00
  987.     CMPA    #$01
  988.     BNE     END_TIME_OUT            ; checkeo que la repetidora no este desactivada por un deseo del usuario
  989.  
  990.     LDA     PATCH
  991.     CMPA    #$01
  992.     BEQ     END_TIME_OUT            ; si esta el patch funcionando, etonces no debe funcionar el anti-poncho
  993.  
  994.     LDA     PIA_0
  995.     ANDA    #$40
  996.     CMPA    #$40
  997.     BEQ     END_TIME_OUT            ; si ya estaba desactivada, es porque ya la desactive, por lo tanto no debo volver a desactivarla, ni volver a decir el mensaje de anti-poncho.
  998.     
  999.     LDA     PIA_0
  1000.     ORA     #%01000000              ; desactivo momentaneamente la rpt.
  1001.     STA     PIA_0
  1002.     
  1003.     LDA     STATE_11
  1004.     CMPA    #$01
  1005.     BNE     NO_PONCHO               ; si no esta activado el mensaje en phone de anti-poncho, me voy
  1006.  
  1007.     LDX     #AUD1_PONCHO
  1008.     LDD     #AUD2_PONCHO
  1009.     STD     OFS_TABLA
  1010.     ORCC    #ENMASK_IRQ             ; deshabilito las interrupciones, ya que sino aletrarian la ecualizacion de la rutina
  1011.     JSR     REPRO                   ; aviso en "Phone" (guarda que concheto!) que se apaga la repe y a joderse por boludo
  1012.     ANDCC   #ENABLE_IRQ             ; habilito nuevamente las interrupciones
  1013.     
  1014.     LDA     PIA_0
  1015.     ORA     #$40
  1016.     STA     PIA_0
  1017. BUG        
  1018.     LDA     PIA_0
  1019.     ANDA    #$80
  1020.     CMPA    #$00
  1021.     BNE     BUG
  1022.  
  1023. NO_PONCHO        
  1024.     BRA     END_TIME_OUT
  1025.  
  1026.  
  1027. ID_OUT
  1028.     LDA     PATCH
  1029.     CMPA    #$01
  1030.     BEQ     END_TIME_OUT            ; si esta funcionando el patch, entonces no debe andar el ID de la RPT
  1031.     
  1032.     LDA     STATE_12
  1033.     CMPA    #$01
  1034.     BNE     END_TIME_OUT            ; checkeo si esta activado o no el anti-poncho
  1035.     JSR     SAY_ID                  ; ejecuto la identificacion
  1036.     
  1037.     LDA     STATE_24
  1038.     CMPA    #$01
  1039.     BEQ     TX_OFF
  1040.     
  1041.     LDA     PIA_0
  1042.     ORA     #$40
  1043.     STA     PIA_0
  1044. TX_OFF        
  1045.     LDD     STATE_13
  1046.     STD     WAIT_TIME               ; cargo el tiempo para la proxima ID
  1047.  
  1048. END_TIME_OUT
  1049.     PULS    A,B,X,Y
  1050.     RTS
  1051.     ; end ---------------------------------------------------------------        
  1052.     
  1053. ; ***************************************************************************
  1054. ; RUTINA DE REPRODUCION DE AUDIO DIGITAL A 31,982642 KBIT/SEG
  1055. ; REPRO()
  1056. ; a esta rutina solo hay que pasarle desde donde y hasta donde debe
  1057. ; reroducir. esto se logra mediante la introduccion en "X" de el 
  1058. ; offset del address de comienzo de reproducion y en OFS_TABLA se
  1059. ; introduce el offset del address de finalizacion.
  1060. ; internamente la rutina esta ecualizada para que no importa los diferentes
  1061. ; branch's que haga, su longitud entre bit y bit sera siempre de 28 ciclos de
  1062. ; clock del micro (el mismo es la freq. del cristal, 3,582056, dividida 
  1063. ; por 4, multiplicada por 28 ciclos, nos da los aprox. 32KBit/seg).
  1064. ; para que la rpt. no se desactive mientras esta reproduciendo, la fuerzo
  1065. ; activada mediante poner PB1=1 y PA6=0. al terminar de reproducir, paso a PB1
  1066. ; a cero y PA6 lo dejo como estaba (previamente grabe el valor inicial en 
  1067. ; VAR_0.
  1068. ; ***************************************************************************
  1069. REPRO
  1070.     PSHS    A,B,X,Y
  1071.     
  1072.     LDA     PIA_0
  1073.     ANDA    #$40
  1074.     STA     VAR_0           ; lo guardo para luego actualizarlo
  1075.  
  1076.     LDA     PIA_0
  1077.     ANDA    #%10111111
  1078.     STA     PIA_0           ; mantengo activada a la rpt (en modo COR y Yaesu)
  1079.  
  1080.     LDA     PIA_2
  1081.     ORA     #%00000010
  1082.     STA     PIA_2           ; mantengo la rpt activada (en modo Yaesu)
  1083.  
  1084.     LDA     #$00
  1085.     LDY     #$6000
  1086. LOOP_REPRO
  1087.     STA     ,X              ; 4 ciclos
  1088.     ORCC    #$00            ; 3 ciclos
  1089.     STA     ,Y              ; 4 ciclos
  1090.  
  1091.     ADDA    #$08            ; 2 ciclos
  1092.     BNE     MODE_99         ; 3 ciclos
  1093.     LEAX    1,X             ; 5 ciclos
  1094.     
  1095.     ADDB    #$00            ; 2 ciclos
  1096.     ADDB    #$00            ; 2 ciclos
  1097.     BRA     LOOP_REPRO      ; 3 ciclos
  1098. MODE_99
  1099.     ADDB    #$00            ; 2 ciclos
  1100.     
  1101.     CMPX    OFS_TABLA       ; 7 ciclos
  1102. ;        BNE     LOOP_REPRO      ; 3 ciclos
  1103.     BLS     LOOP_REPRO      ; 3 ciclos
  1104.  
  1105.     LDA     PIA_0
  1106.     ANDA    #%10111111
  1107.     ADDA    VAR_0
  1108.     STA     PIA_0           ; saco la mantenida de rpt activada
  1109.     
  1110.     LDA     PIA_2
  1111.     ANDA    #%11111101
  1112.     STA     VAR_0
  1113.     LDA     PATCH           ; si el patch esta funcionando, entonces mantengo a PB1=1 (para que se quede la RPT en TX)
  1114.     ROLA
  1115.     ANDA    #$02
  1116.     ADDA    VAR_0
  1117.     STA     PIA_2           ; saco la mantenida de rpt activada
  1118.  
  1119.     PULS   A,B,X,Y
  1120.     RTS
  1121.     ; end ---------------------------------------------------------------        
  1122.  
  1123. ; ***************************************************************************
  1124. ; RUTINA DE GRABACION DE AUDIO DIGITAL A 31,982642 KBIT/SEG
  1125. ; GRABA()
  1126. ; a esta rutina solo hay que pasarle desde donde y hasta donde debe
  1127. ; grabar. esto se logra mediante la introduccion en "X" de el 
  1128. ; offset del address de comienzo de grabacion y en OFS_TABLA se
  1129. ; introduce el offset del address de finalizacion.
  1130. ; internamente la rutina esta ecualizada para que no importa los diferentes
  1131. ; branch's que haga, su longitud entre bit y bit sera siempre de 28 ciclos de
  1132. ; clock del micro (el mismo es la freq. del cristal, 3,582056, dividida 
  1133. ; por 4, multiplicada por 28 ciclos, nos da los aprox. 32KBit/seg).
  1134. ; ***************************************************************************
  1135. GRABA
  1136.     PSHS    A,B,X,Y
  1137.     
  1138.     ORCC    #ENMASK_IRQ      ; deshabilito las interrupciones, ya que sino aletrarian la ecualizacion de la rutina
  1139.     
  1140.     LDA     #$00
  1141.     LDB     #$08
  1142.     LDY     #$6000
  1143. LOOP_GRABA
  1144.     STA     ,X              ; 4 ciclos
  1145.     ORCC    #$00            ; 3 ciclos
  1146.     STB     ,Y              ; 4 ciclos
  1147.  
  1148.     ADDA    #$08            ; 2 ciclos
  1149.     BNE     MODE_98         ; 3 ciclos
  1150.     LEAX    1,X             ; 5 ciclos
  1151.     
  1152.     ADDB    #$00            ; 2 ciclos
  1153.     ADDB    #$08            ; 2 ciclos
  1154.     BRA     LOOP_GRABA      ; 3 ciclos
  1155. MODE_98
  1156.     ADDB    #$08            ; 2 ciclos
  1157.     
  1158.     CMPX    OFS_TABLA       ; 7 ciclos
  1159.     BNE     LOOP_GRABA      ; 3 ciclos
  1160.  
  1161.     ANDCC   #ENABLE_IRQ     ; habilito nuevamente las interrupciones
  1162.     
  1163.     PULS   A,B,X,Y
  1164.     RTS              
  1165.     ; end ---------------------------------------------------------------        
  1166.     
  1167. ; ***************************************************************************
  1168. ; RUTINA QUE GENERA LA IDENTIFICACION EN PHONE DE LA RPT.
  1169. ; SAY_ID()
  1170. ; no requiere ningun parametro externo. el lugar a reproducir esta determinado
  1171. ; por AUD1_ID y AUD2_ID. finalmente reproduce el ID de la rpt.
  1172. ; ***************************************************************************
  1173. SAY_ID        
  1174.     PSHS    A,B,X,Y
  1175.     LDX     #AUD1_ID
  1176.     LDD     #AUD2_ID
  1177.     STD     OFS_TABLA
  1178.     
  1179.     LDA     PIA_1
  1180.     ANDA    #%11110111      ; seteo el control register A, para desactivar el IRQ de 100Hz
  1181.     STA     PIA_1
  1182.  
  1183.     LDA     STATE_03        
  1184.     CMPA    #$01
  1185.     BNE     JUST_REPRO      ; si no esta en modo pager, no tengo por que parar la reproduccion, por lo tanto voy derecho a reproducir
  1186.  
  1187.     LDA     STATE_RPT
  1188.     CMPA    #$01
  1189.     BEQ     JUST_REPRO      ; si la rpt. ya esta activada, entonces no tengo por que parar la reproduccion para checkear el codigo del pager (ya que el codigo ya fue checkeado anteriormente)
  1190.  
  1191.     LDA     PIA_2
  1192.     ORA     #%00000010
  1193.     STA     PIA_2
  1194.  
  1195.     LDA     PIA_2
  1196.     LDA     PIA_3
  1197.     ORA     #%00000011      ; hago que el cic9203 llame a interrupcion _IRQ, de modo que s mientras reproduce el ID, la rpt. se activa, entonces paro de reproducir el audio, para pasar a estar atento hacerca del codigo de pager entrado.
  1198.     STA     PIA_3
  1199. JUST_REPRO
  1200.     JSR     REPRO
  1201.     
  1202.     LDA     PIA_3
  1203.     ANDA    #%11111110      ; hago que el cic9203 no llame a interrupcion _IRQ
  1204.     STA     PIA_3
  1205.     
  1206.     LDA     PIA_0
  1207.     LDA     PIA_1
  1208.     ORA     #%00011100      ; seteo el control register A, para activar IRQ de 100Hz
  1209.     STA     PIA_1
  1210.     
  1211.     PULS    A,B,X,Y
  1212.     RTS
  1213.     ; end ---------------------------------------------------------------        
  1214.  
  1215. ; ***************************************************************************
  1216. ; CHECKEA SI PASA EL CODIGO DE ACCESO AL MODO PATCH.
  1217. ; PASS_PATCH()
  1218. ; no requiere ningun parametro externo. compara el codigo entrado, con el 
  1219. ; guardado en STATE_98. el control del uP no se queda en la rutina.
  1220. ; si se ejecuta un # o * sale de la rutina, y luego PASS_SEL lo utiliza para
  1221. ; no permitir la activacion del Auto Patch.
  1222. ; el fin de codigo esta determinado por un $0C en STATE_98.
  1223. ; ***************************************************************************
  1224. PASS_PATCH        
  1225.     PSHS    A,B,X,Y
  1226. PASS1_PATCH
  1227.     LDY     #STATE_98
  1228. PASS2_PATCH
  1229.     LDB     #$01
  1230.     JSR     DTMF_TECLADO
  1231.     
  1232.     LDA     PRESSED_KEY
  1233.     CMPA    #$0B
  1234.     BEQ     END_PATCH
  1235.     CMPA    #$0C
  1236.     BEQ     END_PATCH               ; si pone # o * salgo y por lo tanto vuelvo a PASS_SEL
  1237.  
  1238.     CMPA    ,Y
  1239.     BNE     PASS1_PATCH
  1240.     LEAY    1,Y
  1241.     
  1242.     LDA     ,Y
  1243.     CMPA    #$0C                    ; cuando aparece un "#" ($0C) quiere decir que termino el codigo de acceso        
  1244.     BNE     PASS2_PATCH
  1245. END_PATCH
  1246.     PULS    A,B,X,Y
  1247.     RTS
  1248.     ; end ---------------------------------------------------------------        
  1249.  
  1250. ; ***************************************************************************
  1251. ; RUTINA DE LECTURA DEL CONVERSOR A/D ADC0804.
  1252. ; ADC_READ()
  1253. ; la rutina lee del address ADC_ADRS, y el valor de la convercion lo 
  1254. ; introduce en ADC_STATE.
  1255. ; ***************************************************************************
  1256. ADC_READ
  1257.     PSHS    A,B,X,Y
  1258.     LDA     ADC_ADRS
  1259.     STA     ADC_STATE
  1260.     PULS    A,B,X,Y
  1261.     RTS
  1262.     ; end ---------------------------------------------------------------        
  1263.  
  1264. ; ***************************************************************************
  1265. ; RUTINA QUE "PRONUNCIA" EL NIVEL DE SENAL CON EL CUAL SE ENTRA A LA RPT.
  1266. ; S_TELLER()
  1267. ; la rutina llama a ADC_READ, para que lea el valor del converson A/D, luego
  1268. ; se encarga de decir el mensaje general a todos los S's y luego el especifico
  1269. ; a cada uno.
  1270. ; ***************************************************************************
  1271. S_TELLER
  1272.     PSHS    A,B,X,Y
  1273.     JSR     ADC_READ
  1274.     LDX     #AUD1_METER             
  1275.     LDD     #AUD2_METER
  1276.     STD     OFS_TABLA
  1277.     ORCC    #ENMASK_IRQ      ; deshabilito las interrupciones, ya que sino aletrarian la ecualizacion de la rutina
  1278.     JSR     REPRO           ; reproduzco la primera parte (comun a todos)        
  1279.     
  1280.     LDA     ADC_STATE
  1281.     CMPA    #31
  1282.     BLS     S1
  1283.     CMPA    #59
  1284.     BLS     S2
  1285.     CMPA    #87
  1286.     BLS     S3
  1287.     CMPA    #115
  1288.     BLS     S4
  1289.     CMPA    #143
  1290.     BLS     S5
  1291.     CMPA    #171
  1292.     BLS     S6
  1293.     CMPA    #199
  1294.     BLS     S7
  1295.     CMPA    #227
  1296.     BLS     S8
  1297.     BRA     S9
  1298. S1
  1299.     LDX     #AUD1_S1
  1300.     LDD     #AUD2_S1
  1301.     STD     OFS_TABLA
  1302.     JSR     REPRO
  1303.     BRA     END_TELLER
  1304. S2
  1305.     LDX     #AUD2_S1
  1306.     LDD     #AUD2_S2
  1307.     STD     OFS_TABLA
  1308.     JSR     REPRO
  1309.     BRA     END_TELLER
  1310. S3
  1311.     LDX     #AUD2_S2
  1312.     LDD     #AUD2_S3
  1313.     STD     OFS_TABLA
  1314.     JSR     REPRO
  1315.     BRA     END_TELLER
  1316. S4
  1317.     LDX     #AUD2_S3
  1318.     LDD     #AUD2_S4
  1319.     STD     OFS_TABLA
  1320.     JSR     REPRO
  1321.     BRA     END_TELLER
  1322. S5
  1323.     LDX     #AUD2_S4
  1324.     LDD     #AUD2_S5
  1325.     STD     OFS_TABLA
  1326.     JSR     REPRO
  1327.     BRA     END_TELLER
  1328. S6
  1329.     LDX     #AUD2_S5
  1330.     LDD     #AUD2_S6
  1331.     STD     OFS_TABLA
  1332.     JSR     REPRO
  1333.     BRA     END_TELLER
  1334. S7
  1335.     LDX     #AUD2_S6
  1336.     LDD     #AUD2_S7
  1337.     STD     OFS_TABLA
  1338.     JSR     REPRO
  1339.     BRA     END_TELLER
  1340. S8
  1341.     LDX     #AUD2_S7
  1342.     LDD     #AUD2_S8
  1343.     STD     OFS_TABLA
  1344.     JSR     REPRO
  1345.     BRA     END_TELLER
  1346. S9
  1347.     LDX     #AUD2_S8
  1348.     LDD     #AUD2_S9
  1349.     STD     OFS_TABLA
  1350.     JSR     REPRO
  1351. END_TELLER
  1352.     LDA     PIA_0           ; reseteo cualquier irq de cor que puede haber ocurrido
  1353.     ANDCC   #ENABLE_IRQ     ; habilito nuevamente las interrupciones
  1354.     PULS    A,B,X,Y
  1355.     RTS
  1356.     ; end ---------------------------------------------------------------        
  1357.  
  1358. ; ***************************************************************************
  1359. ; RUTINA QUE CONVIERTE DE FORMATO DTMF A FORMATO HEXADECIMAL.        
  1360. ; DTMF_HEX()
  1361. ; la rutina lee los cuatro primeros bytes de PRESSED_KEY y mediante el empleo
  1362. ; de la tabla CONV_DTMF_HEX se los conviete en un numero hexadecimal de dos
  1363. ; bytes, que es introducido en los primeros dos bytes de PRESSED_KEY.
  1364. ; los pasos de la convercion son los siguientes:
  1365. ;
  1366. ; (formato DTMF)------>B0(msb)  B1      B2      B3(lsb)
  1367. ;                      I________I       I_______I
  1368. ;                      II               II
  1369. ;                      II               II
  1370. ; (formato HEX)------->B0(msb)          B1(lsb)
  1371. ;
  1372. ; ***************************************************************************
  1373. DTMF_HEX        
  1374.     PSHS    A,B,X,Y
  1375.  
  1376.     LDX     #CONV_DTMF_HEX
  1377.     LDY     #PRESSED_KEY
  1378.     LDB     ,Y
  1379.     ABX        
  1380.     LDB     ,X
  1381.     ANDB    #$F0
  1382.     STB     ,Y
  1383.  
  1384.     LDX     #CONV_DTMF_HEX
  1385.     LEAY    1,Y
  1386.     LDB     ,Y
  1387.     ABX        
  1388.     LDB     ,X
  1389.     ANDB    #$0F
  1390.     STB     VAR_0
  1391.     LEAY    -1,Y
  1392.     LDA     ,Y
  1393.     ADDA    VAR_0
  1394.     STA     ,Y
  1395.  
  1396.     LDX     #CONV_DTMF_HEX          ; aqui comienza la convercion de los dos ultimos bytes
  1397.     LEAY    2,Y
  1398.     LDB     ,Y
  1399.     ABX        
  1400.     LDB     ,X
  1401.     ANDB    #$F0
  1402.     LEAY    -1,Y
  1403.     STB     ,Y
  1404.  
  1405.     LDX     #CONV_DTMF_HEX
  1406.     LEAY    2,Y
  1407.     LDB     ,Y
  1408.     ABX        
  1409.     LDB     ,X
  1410.     ANDB    #$0F
  1411.     STB     VAR_0
  1412.     LEAY    -2,Y
  1413.     LDA     ,Y
  1414.     ADDA    VAR_0
  1415.     STA     ,Y
  1416.  
  1417.     PULS    A,B,X,Y
  1418.     RTS
  1419.     ; end ---------------------------------------------------------------        
  1420.  
  1421. ; ***************************************************************************
  1422. ; RUTINA PARA PASAR LOS DIGITOS PROVENIENTES DEL CIC9203 A DECIMAL.
  1423. ; CONVERT()
  1424. ; lee el primer digito de PRESSED_KEY, y le pone un $00 si fuese $0A
  1425. ; ***************************************************************************
  1426. CONVERT
  1427.     PSHS    A,B,X,Y
  1428.     LDA     PRESSED_KEY
  1429.     CMPA    #$0A
  1430.     BNE     MODE_4
  1431.     LDA     #$00
  1432. MODE_4
  1433.     STA     PRESSED_KEY
  1434.     PULS    A,B,X,Y
  1435.     RTS
  1436.     ; end ---------------------------------------------------------------        
  1437.     
  1438. ; ***************************************************************************
  1439. ; RUTINA DE VALIDACION DE SELECION.
  1440. ; VALIDATE()
  1441. ; esta rutina compara el valor en hex de "A", con el valor de los 2 primeros
  1442. ; bytes de PRESSED_KEY, y da como salida un 0 en "B" si es igual o un 1 si es
  1443. ; desigual.
  1444. ; ademas compara si hay algun tipo de abort (si ABORT_MODE=$0B o 
  1445. ; ABORT_MODE=$0C), si lo hay, no permite la ejecucion de las rutinas.
  1446. ; esta rutina es utilizada por los SUB_xx para saber si deben actuar o no.
  1447. ; ***************************************************************************
  1448. VALIDATE        
  1449.     PSHS    A,X,Y
  1450.     LDB     PRESSED_KEY
  1451.     CMPB    #$0B
  1452.     BEQ     NOT_SELECTED                
  1453.     CMPB    #$0C
  1454.     BEQ     NOT_SELECTED                
  1455.     
  1456.     LDB     #$00
  1457.     LDX     #PRESSED_KEY        
  1458.     STA     VAR_0
  1459.     ANDA    #$0F
  1460.     CMPA    ,X        
  1461.     BNE     NOT_SELECTED
  1462.     LEAX    1,X
  1463.     LDA     VAR_0
  1464.     RORA
  1465.     RORA
  1466.     RORA
  1467.     RORA    ; hay que correr un nibble a "A".
  1468.     ANDA    #$0F
  1469.     CMPA    ,X
  1470.     BEQ     END_VALIDATE
  1471. NOT_SELECTED                
  1472.     LDB     #$01
  1473. END_VALIDATE        
  1474.     PULS    A,X,Y
  1475.     RTS
  1476.     ; end ---------------------------------------------------------------        
  1477.  
  1478. ; ***************************************************************************
  1479. ; RUTINA QUE NO PERMITE QUE SE ACTIVEN DOS SUB_xx EN LA MISMA LECTURA.
  1480. ; OUT()
  1481. ; la rutina checkea si ABORT_MODE contiene un "*", si es asi, sale. pero si
  1482. ; no, introduce en ABORT_MODE y en PRESSED_KEY, un "#", para que no se 
  1483. ; ejecuten las demas rutinas.
  1484. ; ***************************************************************************
  1485. OUT
  1486.     PSHS    A,B,X,Y
  1487.     LDA     ABORT_MODE
  1488.     CMPA    #$0B
  1489.     BEQ     END_OUT         ; si ya ha pedido el usuario salir, entonces no hago nada
  1490.     
  1491.     LDA     #$0C
  1492.     STA     PRESSED_KEY
  1493.     STA     ABORT_MODE
  1494. END_OUT        
  1495.     PULS    A,B,X,Y
  1496.     RTS
  1497.     ; end ---------------------------------------------------------------        
  1498.  
  1499. ; ***************************************************************************
  1500. ; RUTINA DE MANEJO DE STATE_00 (enable/disable rpt)
  1501. ; SUB_00()
  1502. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1503. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1504. ; magnitudes correctas (1/0), lo introduce en STATE_00 y inicializa el timer
  1505. ; del Anti-Poncho.
  1506. ; ***************************************************************************
  1507. SUB_00        
  1508.     PSHS    A,B,X,Y
  1509.     LDA     #$AA
  1510.     JSR     VALIDATE
  1511.     CMPB    #$01        
  1512.     BEQ     END_SUB_00      ; checkeo si eligieron esta funcion o no
  1513.  
  1514.     LDB     #$01
  1515.     JSR     DTMF_TECLADO
  1516.     LDA     ABORT_MODE
  1517.     CMPA    #$0C
  1518.     BEQ     END_SUB_00
  1519.     CMPA    #$0B
  1520.     BEQ     END_SUB_00
  1521.  
  1522.     JSR     CONVERT
  1523.     LDA     PRESSED_KEY
  1524.     JSR     OUT             ; para que no se active ninguna otra sub
  1525.     CMPA    #$01
  1526.     BHI     END_SUB_00      ; checkeo que la variable este entre 0 y 1, sino me voy
  1527.     
  1528.     STA     STATE_00
  1529.     LDD     STATE_10
  1530.     STD     WAIT_TIME       ; inicializo el timer, por lo tanto si activo el Anti-Poncho luego de un timepo de que la RPT este activada, no la desactiva por Anti-Poncho
  1531. END_SUB_00
  1532.     PULS    A,B,X,Y
  1533.     RTS
  1534.     ; end ---------------------------------------------------------------        
  1535.  
  1536. ; ***************************************************************************
  1537. ; RUTINA DE MANEJO DE STATE_03 (enable/disable PAGE CODE RX)
  1538. ; SUB_03()
  1539. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1540. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1541. ; magnitudes correctas (1/0), lo introduce en STATE_03 y finalmente
  1542. ; iniciacliza el timer de la RPT desactivada.
  1543. ; ***************************************************************************
  1544. SUB_03
  1545.     PSHS    A,B,X,Y
  1546.     LDA     #$3A
  1547.     JSR     VALIDATE
  1548.     CMPB    #$01        
  1549.     BEQ     END_SUB_03      ; checkeo si eligieron esta funcion o no
  1550.  
  1551.     LDB     #$01
  1552.     JSR     DTMF_TECLADO
  1553.     LDA     ABORT_MODE
  1554.     CMPA    #$0C
  1555.     BEQ     END_SUB_03
  1556.     CMPA    #$0B
  1557.     BEQ     END_SUB_03
  1558.  
  1559.     JSR     CONVERT
  1560.     LDA     PRESSED_KEY
  1561.     JSR     OUT             ; para que no se active ninguna otra sub
  1562.     CMPA    #$01
  1563.     BHI     END_SUB_03      ; checkeo que la variable este entre 0 y 1, sino me voy
  1564.     
  1565.     STA     STATE_03
  1566.     LDD     STATE_13
  1567.     STD     WAIT_TIME       ; inicializo el timer de RPT en modo disable (ya que al salir del modo chang values el usuario debe mandar el codio del pager para activar la RPT)
  1568. END_SUB_03
  1569.     PULS    A,B,X,Y
  1570.     RTS
  1571.     ; end ---------------------------------------------------------------        
  1572.  
  1573. ; ***************************************************************************
  1574. ; RUTINA DE MANEJO DEL CAMBIO DE CODIGO DE ACCESO DEL PAGER.
  1575. ; SUB_04()
  1576. ; la rutina no requiere parametros externos. pone el nuevo codigo de acceso
  1577. ; provisoriamente en STATE_99_BIS, y luego de validar la informacion, la 
  1578. ; introduce en STATE_04 (si la validacion da algun error, se sale de la 
  1579. ; rutina sin cambiar el codigo del patch (queda STATE_04 como estaba).
  1580. ; la forma de cambiar el codigo de acesso, es la siguiente:
  1581. ;
  1582. ;      (codigo nuevo) + "#" + (codigo nuevo) + "#"
  1583. ;
  1584. ; de esta manera se entra y valida el nuevo codigo, cualquier alteracion hara
  1585. ; que no se valide y por consiguiente no se cambie el valor STATE_04.
  1586. ; para abortar la operacion se puede perfectamente oprimir "*", con lo cual
  1587. ; uno sale del modo de cambio de parametros y la repetidora continua 
  1588. ; funcionando como estaba.
  1589. ; el largo del codigo de acesso no puede ser mayor de 15 caracteres.
  1590. ; ***************************************************************************
  1591. SUB_04
  1592.     PSHS    A,B,X,Y
  1593.     LDA     #$4A
  1594.     JSR     VALIDATE
  1595.     CMPB    #$01        
  1596.     BEQ     END_SUB_04      ; checkeo si eligieron esta funcion o no
  1597.  
  1598.     LDX     #STATE_04
  1599.     STX     OFS_TABLA
  1600.     JSR     CODE_MANAGER
  1601.     JSR     OUT             ; para que no se active ninguna otra sub
  1602. END_SUB_04
  1603.     PULS    A,B,X,Y
  1604.     RTS
  1605.     ; end ---------------------------------------------------------------        
  1606.  
  1607. ; ***************************************************************************
  1608. ; RUTINA DE MANEJO DE STATE_05 (enable/disable Patch)
  1609. ; SUB_05()
  1610. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1611. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1612. ; magnitudes correctas (1/0), lo introduce en STATE_05.
  1613. ; ***************************************************************************
  1614. SUB_05
  1615.     PSHS    A,B,X,Y
  1616.     LDA     #$5A
  1617.     JSR     VALIDATE
  1618.     CMPB    #$01        
  1619.     BEQ     END_SUB_05      ; checkeo si eligieron esta funcion o no
  1620.  
  1621.     LDB     #$01
  1622.     JSR     DTMF_TECLADO
  1623.     LDA     ABORT_MODE
  1624.     CMPA    #$0C
  1625.     BEQ     END_SUB_05
  1626.     CMPA    #$0B
  1627.     BEQ     END_SUB_05
  1628.  
  1629.     JSR     CONVERT
  1630.     LDA     PRESSED_KEY
  1631.     JSR     OUT             ; para que no se active ninguna otra sub
  1632.     CMPA    #$01
  1633.     BHI     END_SUB_05      ; checkeo que la variable este entre 0 y 1, sino me voy
  1634.     
  1635.     STA     STATE_05
  1636. END_SUB_05
  1637.     PULS    A,B,X,Y
  1638.     RTS
  1639.     ; end ---------------------------------------------------------------        
  1640.  
  1641. ; ***************************************************************************
  1642. ; RUTINA DE MANEJO DE STATE_06 (enable/disable USER-1)
  1643. ; SUB_06()
  1644. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1645. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1646. ; magnitudes correctas (1/0), lo introduce en STATE_06.
  1647. ; ***************************************************************************
  1648. SUB_06
  1649.     PSHS    A,B,X,Y
  1650.     LDA     #$6A
  1651.     JSR     VALIDATE
  1652.     CMPB    #$01        
  1653.     BEQ     END_SUB_06      ; checkeo si eligieron esta funcion o no
  1654.  
  1655.     LDB     #$01
  1656.     JSR     DTMF_TECLADO
  1657.     LDA     ABORT_MODE
  1658.     CMPA    #$0C
  1659.     BEQ     END_SUB_06
  1660.     CMPA    #$0B
  1661.     BEQ     END_SUB_06
  1662.  
  1663.     JSR     CONVERT
  1664.     LDA     PRESSED_KEY
  1665.     JSR     OUT             ; para que no se active ninguna otra sub
  1666.     CMPA    #$01
  1667.     BHI     END_SUB_06      ; checkeo que la variable este entre 0 y 1, sino me voy
  1668.     
  1669.     STA     STATE_06
  1670. END_SUB_06
  1671.     PULS    A,B,X,Y
  1672.     RTS
  1673.     ; end ---------------------------------------------------------------        
  1674.  
  1675. ; ***************************************************************************
  1676. ; RUTINA DE MANEJO DE STATE_07 (enable/disable USER-2)
  1677. ; SUB_07()
  1678. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1679. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1680. ; magnitudes correctas (1/0), lo introduce en STATE_07.
  1681. ; ***************************************************************************
  1682. SUB_07
  1683.     PSHS    A,B,X,Y
  1684.     LDA     #$7A
  1685.     JSR     VALIDATE
  1686.     CMPB    #$01        
  1687.     BEQ     END_SUB_07      ; checkeo si eligieron esta funcion o no
  1688.  
  1689.     LDB     #$01
  1690.     JSR     DTMF_TECLADO
  1691.     LDA     ABORT_MODE
  1692.     CMPA    #$0C
  1693.     BEQ     END_SUB_07
  1694.     CMPA    #$0B
  1695.     BEQ     END_SUB_07
  1696.  
  1697.     JSR     CONVERT
  1698.     LDA     PRESSED_KEY
  1699.     JSR     OUT             ; para que no se active ninguna otra sub
  1700.     CMPA    #$01
  1701.     BHI     END_SUB_07      ; checkeo que la variable este entre 0 y 1, sino me voy
  1702.     
  1703.     STA     STATE_07
  1704. END_SUB_07
  1705.     PULS    A,B,X,Y
  1706.     RTS
  1707.     ; end ---------------------------------------------------------------        
  1708.  
  1709. ; ***************************************************************************
  1710. ; RUTINA DE MANEJO DE STATE_08 (enable/disable USER-3)
  1711. ; SUB_08()
  1712. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1713. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1714. ; magnitudes correctas (1/0), lo introduce en STATE_08.
  1715. ; ***************************************************************************
  1716. SUB_08
  1717.     PSHS    A,B,X,Y
  1718.     LDA     #$8A
  1719.     JSR     VALIDATE
  1720.     CMPB    #$01        
  1721.     BEQ     END_SUB_08      ; checkeo si eligieron esta funcion o no
  1722.  
  1723.     LDB     #$01
  1724.     JSR     DTMF_TECLADO
  1725.     LDA     ABORT_MODE
  1726.     CMPA    #$0C
  1727.     BEQ     END_SUB_08
  1728.     CMPA    #$0B
  1729.     BEQ     END_SUB_08
  1730.  
  1731.     JSR     CONVERT
  1732.     LDA     PRESSED_KEY
  1733.     JSR     OUT             ; para que no se active ninguna otra sub
  1734.     CMPA    #$01
  1735.     BHI     END_SUB_08      ; checkeo que la variable este entre 0 y 1, sino me voy
  1736.     
  1737.     STA     STATE_08
  1738. END_SUB_08
  1739.     PULS    A,B,X,Y
  1740.     RTS
  1741.     ; end ---------------------------------------------------------------        
  1742.  
  1743. ; ***************************************************************************
  1744. ; RUTINA DE MANEJO DE STATE_09 (enable/disable ANTI-PONCHUS)
  1745. ; SUB_09()
  1746. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1747. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1748. ; magnitudes correctas (1/0), lo introduce en STATE_09 y inicializa el timer.
  1749. ; ***************************************************************************
  1750. SUB_09
  1751.     PSHS    A,B,X,Y
  1752.     LDA     #$9A
  1753.     JSR     VALIDATE
  1754.     CMPB    #$01        
  1755.     BEQ     END_SUB_09      ; checkeo si eligieron esta funcion o no
  1756.  
  1757.     LDB     #$01
  1758.     JSR     DTMF_TECLADO
  1759.     LDA     ABORT_MODE
  1760.     CMPA    #$0C
  1761.     BEQ     END_SUB_09
  1762.     CMPA    #$0B
  1763.     BEQ     END_SUB_09
  1764.  
  1765.     JSR     CONVERT
  1766.     LDA     PRESSED_KEY
  1767.     JSR     OUT             ; para que no se active ninguna otra sub
  1768.     CMPA    #$01
  1769.     BHI     END_SUB_09      ; checkeo que la variable este entre 0 y 1, sino me voy
  1770.     
  1771.     STA     STATE_09
  1772.     LDD     STATE_10
  1773.     STD     WAIT_TIME       ; inicializo el timer, por lo tanto si activo el Anti-Poncho luego de un timepo de que la RPT este activada, no la desactiva por Anti-Poncho
  1774. END_SUB_09
  1775.     PULS    A,B,X,Y
  1776.     RTS
  1777.     ; end ---------------------------------------------------------------        
  1778.  
  1779. ; ***************************************************************************
  1780. ; RUTINA DE MANEJO DE STATE_10 (tiempo antes de producir el ANTI-PONCHUS)
  1781. ; SUB_10()
  1782. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1783. ; leer 4 byte del cic9203, los convierte a hex, y los introduce en STATE_10,
  1784. ; siempre y cuando sea mayor a 2 segs.
  1785. ; ***************************************************************************
  1786. SUB_10
  1787.     PSHS    A,B,X,Y
  1788.     LDA     #$A1
  1789.     JSR     VALIDATE
  1790.     CMPB    #$01        
  1791.     BEQ     END_SUB_10      ; checkeo si eligieron esta funcion o no
  1792.  
  1793.     LDB     #$04
  1794.     JSR     DTMF_TECLADO
  1795.     LDA     ABORT_MODE
  1796.     CMPA    #$0C
  1797.     BEQ     END_SUB_10
  1798.     CMPA    #$0B
  1799.     BEQ     END_SUB_10
  1800.     
  1801.     JSR     DTMF_HEX        ; convierto a PRESSED_KEY de formato DTMF a formato HEX
  1802.  
  1803.     LDD     PRESSED_KEY
  1804.     CMPD    #0200
  1805.     BLO     END_SUB_10      ; no puede ser menor de 2 segs.
  1806.     CMPD    STATE_26
  1807.     BLS     END_SUB_10      ; debe ser mayor que STATE_26
  1808.  
  1809.     STD     STATE_10        ; guardo el valor convertido en STATE_10 
  1810.     STD     WAIT_TIME       ; inicializo el timer nuevamente
  1811.     JSR     OUT             ; para que no se active ninguna otra sub
  1812. END_SUB_10
  1813.     PULS    A,B,X,Y
  1814.     RTS
  1815.     ; end ---------------------------------------------------------------        
  1816.  
  1817. ; ***************************************************************************
  1818. ; RUTINA DE MANEJO DE STATE_11 (enable/disable ANTI-PONCHUS PHONE ID)
  1819. ; SUB_11()
  1820. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1821. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1822. ; magnitudes correctas (1/0), lo introduce en STATE_11.
  1823. ; ***************************************************************************
  1824. SUB_11
  1825.     PSHS    A,B,X,Y
  1826.     LDA     #$11
  1827.     JSR     VALIDATE
  1828.     CMPB    #$01        
  1829.     BEQ     END_SUB_11      ; checkeo si eligieron esta funcion o no
  1830.  
  1831.     LDB     #$01
  1832.     JSR     DTMF_TECLADO
  1833.     LDA     ABORT_MODE
  1834.     CMPA    #$0C
  1835.     BEQ     END_SUB_11
  1836.     CMPA    #$0B
  1837.     BEQ     END_SUB_11
  1838.  
  1839.     JSR     CONVERT
  1840.     LDA     PRESSED_KEY
  1841.     JSR     OUT             ; para que no se active ninguna otra sub
  1842.     CMPA    #$01
  1843.     BHI     END_SUB_11      ; checkeo que la variable este entre 0 y 1, sino me voy
  1844.     
  1845.     STA     STATE_11
  1846. END_SUB_11
  1847.     PULS    A,B,X,Y
  1848.     RTS
  1849.     ; end ---------------------------------------------------------------        
  1850.  
  1851. ; ***************************************************************************
  1852. ; RUTINA DE MANEJO DE STATE_12 (enable/disable auto PHONE ID utilities)
  1853. ; SUB_12()
  1854. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1855. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1856. ; magnitudes correctas (1/0), lo introduce en STATE_12.
  1857. ; ***************************************************************************
  1858. SUB_12
  1859.     PSHS    A,B,X,Y
  1860.     LDA     #$21
  1861.     JSR     VALIDATE
  1862.     CMPB    #$01        
  1863.     BEQ     END_SUB_12      ; checkeo si eligieron esta funcion o no
  1864.  
  1865.     LDB     #$01
  1866.     JSR     DTMF_TECLADO
  1867.     LDA     ABORT_MODE
  1868.     CMPA    #$0C
  1869.     BEQ     END_SUB_12
  1870.     CMPA    #$0B
  1871.     BEQ     END_SUB_12
  1872.  
  1873.     JSR     CONVERT
  1874.     LDA     PRESSED_KEY
  1875.     JSR     OUT             ; para que no se active ninguna otra sub
  1876.     CMPA    #$01
  1877.     BHI     END_SUB_12      ; checkeo que la variable este entre 0 y 1, sino me voy
  1878.     
  1879.     STA     STATE_12
  1880. END_SUB_12
  1881.     PULS    A,B,X,Y
  1882.     RTS
  1883.     ; end ---------------------------------------------------------------        
  1884.  
  1885. ; ***************************************************************************
  1886. ; RUTINA DE MANEJO DE STATE_13 (tiempo entre ID's con rpt. QAP)
  1887. ; SUB_13()
  1888. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1889. ; leer 4 byte del cic9203, los convierte a hex, y los introduce en STATE_13,
  1890. ; siempre y cuando el valor resultante sea mayor de 2s. luego regenera a 
  1891. ; STATE_13 y lo compara, la forma de realizarlo es la siguiente:
  1892. ;
  1893. ;       (antes de adquirir el no. de STATE_13)
  1894. ;          STATE_13 - STATE_14 = TIME (tiempo de ID al activar rpt.)
  1895. ;
  1896. ;
  1897. ;       (una vez adquirido el no. STATE_13')               
  1898. ;          STATE_13' - TIME = STATE_14
  1899. ;
  1900. ;
  1901. ;       (comparo antes de grabar a STATE_13' en STATE_13)
  1902. ;          if STATE_13' > TIME and STATE_13'> #0200 then STATE_13 = STATE_13'
  1903. ;
  1904. ; ***************************************************************************
  1905. SUB_13
  1906.     PSHS    A,B,X,Y
  1907.     LDA     #$31
  1908.     JSR     VALIDATE
  1909.     CMPB    #$01        
  1910.     LBEQ    END_SUB_13      ; checkeo si eligieron esta funcion o no
  1911.     
  1912.     LDD     STATE_13
  1913.     SUBD    STATE_14
  1914.     STD     OFS_TABLA       ; esto lo utilizo luego para regenerar a STATE_14
  1915.     
  1916.     LDB     #$04
  1917.     JSR     DTMF_TECLADO
  1918.     LDA     ABORT_MODE
  1919.     CMPA    #$0C
  1920.     BEQ     END_SUB_13
  1921.     CMPA    #$0B
  1922.     BEQ     END_SUB_13
  1923.  
  1924.     JSR     DTMF_HEX        ; convierto a PRESSED_KEY de formato DTMF a formato HEX
  1925.  
  1926.     LDD     PRESSED_KEY
  1927.     JSR     OUT             ; para que no se active ninguna otra sub
  1928.     CMPD    #0200
  1929.     BLO     END_SUB_13              ; no puede ser menor de 2 segs
  1930.     CMPD    OFS_TABLA               ; el tiempo entre ID's no puede ser  mayor que el tiempo de activar rpt. con ID (yo me entiendo)
  1931.     BLS     END_SUB_13              ; no puede ser menor o igual que STATE_14
  1932.  
  1933.     STD     STATE_13                ; guardo el valor convertido en STATE_13 
  1934.     SUBD    OFS_TABLA
  1935.     STD     STATE_14                ; regenero a STATE_14
  1936. END_SUB_13
  1937.     PULS    A,B,X,Y
  1938.     RTS
  1939.     ; end ---------------------------------------------------------------        
  1940.  
  1941. ; ***************************************************************************
  1942. ; RUTINA DE MANEJO DE STATE_14 (tiempo entre ID's al activar rpt)
  1943. ; SUB_14()
  1944. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1945. ; leer 4 byte del cic9203, los convierte a hex, y los introduce en STATE_14,
  1946. ; siempre y cuando TIME sea menor que STATE_13. la forma de realizarlo es la
  1947. ; siguiente:
  1948. ;        (TIME es el valor introducido por el usuario)
  1949. ;               STATE_13 - TIME = STATE_14'
  1950. ;
  1951. ;
  1952. ;        (comparo antes de grabar STATE_14')
  1953. ;               if TIME < STATE_13 then STATE_14 = STATE_14'
  1954. ;
  1955. ; ***************************************************************************
  1956. SUB_14
  1957.     PSHS    A,B,X,Y
  1958.     LDA     #$41
  1959.     JSR     VALIDATE
  1960.     CMPB    #$01        
  1961.     BEQ     END_SUB_14      ; checkeo si eligieron esta funcion o no
  1962.  
  1963.     LDB     #$04
  1964.     JSR     DTMF_TECLADO
  1965.     LDA     ABORT_MODE
  1966.     CMPA    #$0C
  1967.     BEQ     END_SUB_14
  1968.     CMPA    #$0B
  1969.     BEQ     END_SUB_14
  1970.  
  1971.     JSR     DTMF_HEX        ; convierto a PRESSED_KEY de formato DTMF a formato HEX
  1972.  
  1973.     LDD     PRESSED_KEY
  1974.     JSR     OUT             ; para que no se active ninguna otra sub
  1975.     CMPD    STATE_13
  1976.     BHS     END_SUB_14      ; no puede ser mayor o igual a STATE_13
  1977.     
  1978.     STD     OFS_TABLA
  1979.     LDD     STATE_13
  1980.     SUBD    OFS_TABLA
  1981.     STD     STATE_14        ; guardo el valor convertido en STATE_14 
  1982. END_SUB_14
  1983.     PULS    A,B,X,Y
  1984.     RTS
  1985.     ; end ---------------------------------------------------------------        
  1986.  
  1987. ; ***************************************************************************
  1988. ; RUTINA DE MANEJO DE STATE_15 (enable/disable DTMF PHONE ID)
  1989. ; SUB_15()
  1990. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  1991. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  1992. ; magnitudes correctas (1/0), lo introduce en STATE_15.
  1993. ; ***************************************************************************
  1994. SUB_15
  1995.     PSHS    A,B,X,Y
  1996.     LDA     #$51
  1997.     JSR     VALIDATE
  1998.     CMPB    #$01        
  1999.     BEQ     END_SUB_15      ; checkeo si eligieron esta funcion o no
  2000.  
  2001.     LDB     #$01
  2002.     JSR     DTMF_TECLADO
  2003.     LDA     ABORT_MODE
  2004.     CMPA    #$0C
  2005.     BEQ     END_SUB_15
  2006.     CMPA    #$0B
  2007.     BEQ     END_SUB_15
  2008.  
  2009.     JSR     CONVERT
  2010.     LDA     PRESSED_KEY
  2011.     JSR     OUT             ; para que no se active ninguna otra sub
  2012.     CMPA    #$01
  2013.     BHI     END_SUB_15      ; checkeo que la variable este entre 0 y 1, sino me voy
  2014.     
  2015.     STA     STATE_15
  2016. END_SUB_15
  2017.     PULS    A,B,X,Y
  2018.     RTS
  2019.     ; end ---------------------------------------------------------------        
  2020.  
  2021. ; ***************************************************************************
  2022. ; RUTINA DE MANEJO DE STATE_16 (DTMF code for ID, 1 digit)
  2023. ; SUB_16()
  2024. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2025. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  2026. ; magnitudes correctas y no sea igual al valor de "A", "C","#" o "*" el valor 
  2027. ; del DTMD S-Meter Teller (STATE_21), lo introduce en STATE_16.
  2028. ; ***************************************************************************
  2029. SUB_16
  2030.     PSHS    A,B,X,Y
  2031.     LDA     #$61
  2032.     JSR     VALIDATE
  2033.     CMPB    #$01        
  2034.     BEQ     END_SUB_16      ; checkeo si eligieron esta funcion o no
  2035.  
  2036.     LDB     #$01
  2037.     JSR     DTMF_TECLADO
  2038.     LDA     ABORT_MODE
  2039.     CMPA    #$0C
  2040.     BEQ     END_SUB_16
  2041.     CMPA    #$0B
  2042.     BEQ     END_SUB_16
  2043.  
  2044.     LDA     PRESSED_KEY
  2045.     JSR     OUT             ; para que no se active ninguna otra sub
  2046.     CMPA    #$0D    ; "A"
  2047.     BEQ     END_SUB_16      
  2048.     CMPA    #$0F    ; "C"
  2049.     BEQ     END_SUB_16      
  2050.     CMPA    STATE_21        ; checkea que no sea igual al S-Teller code
  2051.     BEQ     END_SUB_16      
  2052.         
  2053.             ; si valida el dato, y no es igual a ningun otro codigo, lo graba
  2054.     STA     STATE_16
  2055. END_SUB_16
  2056.     PULS    A,B,X,Y
  2057.     RTS
  2058.     ; end ---------------------------------------------------------------        
  2059.  
  2060. ; ***************************************************************************
  2061. ; RUTINA DE MANEJO DE STATE_17 (Record only ID Message)
  2062. ; SUB_17()
  2063. ; si es llamada graba el audio del mensage del ID de la rpt. solamente. esto 
  2064. ; es solo 8 seg. se activa cuando PA7 = 0.
  2065. ; ***************************************************************************
  2066. SUB_17
  2067.     PSHS    A,B,X,Y
  2068.     LDA     #$71
  2069.     JSR     VALIDATE
  2070.     CMPB    #$01        
  2071.     BEQ     END_SUB_17      ; checkeo si eligieron esta funcion o no
  2072.  
  2073. LOOP_17
  2074.     LDA     PIA_0
  2075.     ANDA    #$80
  2076.     CMPA    #$80
  2077.     BEQ     LOOP_17        ; espero que PA7 se ponga en 0 para comenzar la grabacion
  2078.  
  2079.     LDX     #AUD1_ID        ; si la eligieron, grabo solo el sector de 8 seg correspondiente al ID Message
  2080.     LDD     #AUD2_ID 
  2081.     STD     OFS_TABLA
  2082.     JSR     GRABA
  2083.     JSR     OUT             ; para que no se active ninguna otra sub
  2084. END_SUB_17
  2085.     PULS    A,B,X,Y
  2086.     RTS
  2087.     ; end ---------------------------------------------------------------        
  2088.  
  2089. ; ***************************************************************************
  2090. ; RUTINA DE MANEJO DE STATE_18 (Record)
  2091. ; SUB_18()
  2092. ; si es llamada graba todo el audio (los 24 seg.), se activa cuando PA7 = 0.
  2093. ; ***************************************************************************
  2094. SUB_18
  2095.     PSHS    A,B,X,Y
  2096.     LDA     #$81
  2097.     JSR     VALIDATE
  2098.     CMPB    #$01        
  2099.     BEQ     END_SUB_18      ; checkeo si eligieron esta funcion o no
  2100.  
  2101. LOOP_18
  2102.     LDA     PIA_0
  2103.     ANDA    #$80
  2104.     CMPA    #$80
  2105.     BEQ     LOOP_18        ; espero que PA7 se ponga en 0 para comenzar la grabacion
  2106.  
  2107.     LDX     #AUDIO          ; si la eligieron, grabo todo el audio
  2108.     LDD     #FIN_AUDIO
  2109.     STD     OFS_TABLA
  2110.     JSR     GRABA
  2111.     JSR     OUT             ; para que no se active ninguna otra sub
  2112. END_SUB_18
  2113.     PULS    A,B,X,Y
  2114.     RTS
  2115.     ; end ---------------------------------------------------------------        
  2116.  
  2117. ; ***************************************************************************
  2118. ; RUTINA DE MANEJO DE STATE_19 (Test Play-All)
  2119. ; SUB_19()
  2120. ; si es llamada reproduce todo el audio (los 24 seg.)
  2121. ; ***************************************************************************
  2122. SUB_19
  2123.     PSHS    A,B,X,Y
  2124.     LDA     #$91
  2125.     JSR     VALIDATE
  2126.     CMPB    #$01        
  2127.     BEQ     END_SUB_19      ; checkeo si eligieron esta funcion o no
  2128.  
  2129.     LDX     #AUDIO          ; si la eligieron, reproduzco todo el audio
  2130.     LDD     #FIN_AUDIO
  2131.     STD     OFS_TABLA
  2132.     JSR     REPRO
  2133.     JSR     OUT             ; para que no se active ninguna otra sub
  2134. END_SUB_19
  2135.     PULS    A,B,X,Y
  2136.     RTS
  2137.     ; end ---------------------------------------------------------------        
  2138.  
  2139. ; ***************************************************************************
  2140. ; RUTINA DE MANEJO DE STATE_20 (enable/disable S-METER Teller by DTMF)
  2141. ; SUB_20()
  2142. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2143. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  2144. ; magnitudes correctas (1/0), lo introduce en STATE_20.
  2145. ; ***************************************************************************
  2146. SUB_20
  2147.     PSHS    A,B,X,Y
  2148.     LDA     #$A2
  2149.     JSR     VALIDATE
  2150.     CMPB    #$01        
  2151.     BEQ     END_SUB_20      ; checkeo si eligieron esta funcion o no
  2152.  
  2153.     LDB     #$01
  2154.     JSR     DTMF_TECLADO
  2155.     LDA     ABORT_MODE
  2156.     CMPA    #$0C
  2157.     BEQ     END_SUB_20
  2158.     CMPA    #$0B
  2159.     BEQ     END_SUB_20
  2160.  
  2161.     JSR     CONVERT
  2162.     LDA     PRESSED_KEY
  2163.     JSR     OUT             ; para que no se active ninguna otra sub
  2164.     CMPA    #$01
  2165.     BHI     END_SUB_20      ; checkeo que la variable este entre 0 y 1, sino me voy
  2166.     
  2167.     STA     STATE_20
  2168. END_SUB_20
  2169.     PULS    A,B,X,Y
  2170.     RTS
  2171.     ; end ---------------------------------------------------------------        
  2172.  
  2173. ; ***************************************************************************
  2174. ; RUTINA DE MANEJO DE STATE_21 (DTMF code for S-Meter Teller, 1 digit)
  2175. ; SUB_21()
  2176. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2177. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  2178. ; magnitudes correctas y no sea igual al valor de "A", "C","#" o "*" el valor 
  2179. ; del DTMD ID (STATE_16), lo introduce en STATE_21.
  2180. ; ***************************************************************************
  2181. SUB_21
  2182.     PSHS    A,B,X,Y
  2183.     LDA     #$12
  2184.     JSR     VALIDATE
  2185.     CMPB    #$01        
  2186.     BEQ     END_SUB_21      ; checkeo si eligieron esta funcion o no
  2187.  
  2188.     LDB     #$01
  2189.     JSR     DTMF_TECLADO
  2190.     LDA     ABORT_MODE
  2191.     CMPA    #$0C
  2192.     BEQ     END_SUB_21
  2193.     CMPA    #$0B
  2194.     BEQ     END_SUB_21
  2195.  
  2196.     LDA     PRESSED_KEY
  2197.     JSR     OUT             ; para que no se active ninguna otra sub
  2198.     CMPA    #$0D    ; "A"
  2199.     BEQ     END_SUB_21      
  2200.     CMPA    #$0F    ; "C"
  2201.     BEQ     END_SUB_21      
  2202.     CMPA    STATE_16        ; checkea que no sea igual al DTMF ID code
  2203.     BEQ     END_SUB_21      
  2204.         
  2205.             ; si valida el dato, y no es igual a ningun otro codigo, lo graba
  2206.     STA     STATE_21
  2207. END_SUB_21
  2208.     PULS    A,B,X,Y
  2209.     RTS
  2210.     ; end ---------------------------------------------------------------        
  2211.  
  2212. ; ***************************************************************************
  2213. ; RUTINA DE MANEJO DE STATE_22 (tiempo del Squelch Tail)
  2214. ; SUB_22()
  2215. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2216. ; leer 4 byte del cic9203, los convierte a hex, y los introduce en STATE_22.
  2217. ; ***************************************************************************
  2218. SUB_22
  2219.     PSHS    A,B,X,Y
  2220.     LDA     #$22
  2221.     JSR     VALIDATE
  2222.     CMPB    #$01        
  2223.     BEQ     END_SUB_22      ; checkeo si eligieron esta funcion o no
  2224.  
  2225.     LDB     #$04
  2226.     JSR     DTMF_TECLADO
  2227.     LDA     ABORT_MODE
  2228.     CMPA    #$0C
  2229.     BEQ     END_SUB_22
  2230.     CMPA    #$0B
  2231.     BEQ     END_SUB_22
  2232.  
  2233.     JSR     DTMF_HEX        ; convierto a PRESSED_KEY de formato DTMF a formato HEX
  2234.  
  2235.     LDD     PRESSED_KEY
  2236.     STD     STATE_22        ; guardo el valor convertido en STATE_22 
  2237.     JSR     OUT             ; para que no se active ninguna otra sub
  2238. END_SUB_22
  2239.     PULS    A,B,X,Y
  2240.     RTS
  2241.     ; end ---------------------------------------------------------------        
  2242.  
  2243. ; ***************************************************************************
  2244. ; RUTINA DE RESET WITH DEFAULT VALUES (boot-up rpt. with default values)
  2245. ; SUB_23()
  2246. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2247. ; leer 4 bytes del cic9203 y comprobar que el valor entrado es de 6666 (por
  2248. ; que se me canto el culo!!!) genera un boot-up with default values, llamando 
  2249. ; a FULL_RESET.
  2250. ; ***************************************************************************
  2251. SUB_23
  2252.     PSHS    A,B,X,Y
  2253.     LDA     #$32
  2254.     JSR     VALIDATE
  2255.     CMPB    #$01        
  2256.     BEQ     END_SUB_23      ; checkeo si eligieron esta funcion o no
  2257.  
  2258.     LDB     #$04
  2259.     JSR     DTMF_TECLADO
  2260.     LDA     ABORT_MODE
  2261.     CMPA    #$0C
  2262.     BEQ     END_SUB_23
  2263.     CMPA    #$0B
  2264.     BEQ     END_SUB_23
  2265.  
  2266.     LDX     #PRESSED_KEY
  2267.     LDD     ,X
  2268.     CMPD    #$0606
  2269.     BNE     END_SUB_23
  2270.     LEAX    2,X
  2271.     LDD     ,X
  2272.     CMPD    #$0606
  2273.     BNE     END_SUB_23
  2274.  
  2275.     JMP     FULL_RESET      ; si paso el codigo requerido, genera el boot-up with default values
  2276. END_SUB_23
  2277.     PULS    A,B,X,Y
  2278.     RTS
  2279.     ; end ---------------------------------------------------------------        
  2280.  
  2281. ; ***************************************************************************
  2282. ; RUTINA DE MANEJO DE STATE_24 (enable/disable rpt)
  2283. ; SUB_24()
  2284. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2285. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  2286. ; magnitudes correctas (1/0), lo introduce en STATE_24.
  2287. ; ***************************************************************************
  2288. SUB_24
  2289.     PSHS    A,B,X,Y
  2290.     LDA     #$42
  2291.     JSR     VALIDATE
  2292.     CMPB    #$01        
  2293.     BEQ     END_SUB_24      ; checkeo si eligieron esta funcion o no
  2294.  
  2295.     LDB     #$01
  2296.     JSR     DTMF_TECLADO
  2297.     LDA     ABORT_MODE
  2298.     CMPA    #$0C
  2299.     BEQ     END_SUB_24
  2300.     CMPA    #$0B
  2301.     BEQ     END_SUB_24
  2302.  
  2303.     JSR     CONVERT
  2304.     LDA     PRESSED_KEY
  2305.     JSR     OUT             ; para que no se active ninguna otra sub
  2306.     CMPA    #$01
  2307.     BHI     END_SUB_24      ; checkeo que la variable este entre 0 y 1, sino me voy
  2308.     
  2309.     STA     STATE_24
  2310. END_SUB_24
  2311.     PULS    A,B,X,Y
  2312.     RTS
  2313.     ; end ---------------------------------------------------------------        
  2314.  
  2315. ; ***************************************************************************
  2316. ; RUTINA DE MANEJO DE STATE_25 (enable/disable Instant Mode)
  2317. ; SUB_25()
  2318. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2319. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  2320. ; magnitudes correctas (1/0), lo introduce en STATE_25.
  2321. ; ***************************************************************************
  2322. SUB_25
  2323.     PSHS    A,B,X,Y
  2324.     LDA     #$52
  2325.     JSR     VALIDATE
  2326.     CMPB    #$01        
  2327.     BEQ     END_SUB_25      ; checkeo si eligieron esta funcion o no
  2328.  
  2329.     LDB     #$01
  2330.     JSR     DTMF_TECLADO
  2331.     LDA     ABORT_MODE
  2332.     CMPA    #$0C
  2333.     BEQ     END_SUB_25
  2334.     CMPA    #$0B
  2335.     BEQ     END_SUB_25
  2336.  
  2337.     JSR     CONVERT
  2338.     LDA     PRESSED_KEY
  2339.     JSR     OUT             ; para que no se active ninguna otra sub
  2340.     CMPA    #$01
  2341.     BHI     END_SUB_25      ; checkeo que la variable este entre 0 y 1, sino me voy
  2342.     
  2343.     STA     STATE_25
  2344. END_SUB_25
  2345.     PULS    A,B,X,Y
  2346.     RTS
  2347.     ; end ---------------------------------------------------------------        
  2348.  
  2349. ; ***************************************************************************
  2350. ; RUTINA DE MANEJO DE STATE_26 (Instant Mode max. PTT time)
  2351. ; SUB_26()
  2352. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2353. ; leer 4 byte del cic9203 y convertirlos de formato DTMF a HEX, los introduce 
  2354. ; en STATE_26.
  2355. ; ***************************************************************************
  2356. SUB_26
  2357.     PSHS    A,B,X,Y
  2358.     LDA     #$62
  2359.     JSR     VALIDATE
  2360.     CMPB    #$01        
  2361.     BEQ     END_SUB_26      ; checkeo si eligieron esta funcion o no
  2362.  
  2363.     LDB     #$04
  2364.     JSR     DTMF_TECLADO
  2365.     LDA     ABORT_MODE
  2366.     CMPA    #$0C
  2367.     BEQ     END_SUB_26
  2368.     CMPA    #$0B
  2369.     BEQ     END_SUB_26
  2370.  
  2371.     JSR     DTMF_HEX        ; convierto de formato DTMF a formato HEX.
  2372.  
  2373.     LDD     PRESSED_KEY
  2374.     JSR     OUT             ; para que no se active ninguna otra sub
  2375.     CMPD    #0004
  2376.     BLO     END_SUB_26      ; checkeo que la variable no sea menor que 4, sino me voy
  2377.     CMPD    STATE_10
  2378.     BHS     END_SUB_26      ; checkeo que la variable no sea mayor o igual al tiempo de antiponcho
  2379.  
  2380.     STA     STATE_26
  2381. END_SUB_26
  2382.     PULS    A,B,X,Y
  2383.     RTS
  2384.     ; end ---------------------------------------------------------------        
  2385.  
  2386. ; ***************************************************************************
  2387. ; RUTINA DE MANEJO DE STATE_27 (Instant Mode min. PTT time)
  2388. ; SUB_27()
  2389. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2390. ; leer 4 byte del cic9203 y convertirlos de formato DTMF a HEX, los introduce 
  2391. ; en STATE_27.
  2392. ; ***************************************************************************
  2393. SUB_27
  2394.     PSHS    A,B,X,Y
  2395.     LDA     #$72
  2396.     JSR     VALIDATE
  2397.     CMPB    #$01        
  2398.     BEQ     END_SUB_27      ; checkeo si eligieron esta funcion o no
  2399.  
  2400.     LDB     #$04
  2401.     JSR     DTMF_TECLADO
  2402.     LDA     ABORT_MODE
  2403.     CMPA    #$0C
  2404.     BEQ     END_SUB_27
  2405.     CMPA    #$0B
  2406.     BEQ     END_SUB_27
  2407.  
  2408.     JSR     DTMF_HEX        ; convierto de formato DTMF a formato HEX.
  2409.  
  2410.     LDD     PRESSED_KEY
  2411.     JSR     OUT             ; para que no se active ninguna otra sub
  2412.     CMPD    #0003
  2413.     BLO     END_SUB_27      ; checkeo que la variable no sea menor que 3, sino me voy
  2414.     CMPD    STATE_26
  2415.     BHS     END_SUB_27      ; checkeo que la variable no sea mayor o igual al tiempo max. de activacion del PTT
  2416.  
  2417.     STA     STATE_27
  2418. END_SUB_27
  2419.     PULS    A,B,X,Y
  2420.     RTS
  2421.     ; end ---------------------------------------------------------------        
  2422.  
  2423. ; ***************************************************************************
  2424. ; RUTINA DE MANEJO DE STATE_28 (Instant Mode ID or S Teller enable)
  2425. ; SUB_28()
  2426. ; la rutina checkea primero si debe activarce (llendo a VALIDATE) y luego de
  2427. ; leer 1 byte del cic9203 y comprobar que el valor entrado esta dentro de las 
  2428. ; magnitudes correctas (1/0), lo introduce en STATE_28.
  2429. ; ***************************************************************************
  2430. SUB_28
  2431.     PSHS    A,B,X,Y
  2432.     LDA     #$82
  2433.     JSR     VALIDATE
  2434.     CMPB    #$01        
  2435.     BEQ     END_SUB_28      ; checkeo si eligieron esta funcion o no
  2436.  
  2437.     LDB     #$01
  2438.     JSR     DTMF_TECLADO
  2439.     LDA     ABORT_MODE
  2440.     CMPA    #$0C
  2441.     BEQ     END_SUB_28
  2442.     CMPA    #$0B
  2443.     BEQ     END_SUB_28
  2444.  
  2445.     JSR     CONVERT
  2446.     LDA     PRESSED_KEY
  2447.     JSR     OUT             ; para que no se active ninguna otra sub
  2448.     CMPA    #$01
  2449.     BHI     END_SUB_28      ; checkeo que la variable este entre 0 y 1, sino me voy
  2450.     
  2451.     STA     STATE_28
  2452. END_SUB_28
  2453.     PULS    A,B,X,Y
  2454.     RTS
  2455.     ; end ---------------------------------------------------------------        
  2456.  
  2457. ; ***************************************************************************
  2458. ; RUTINA DE MANEJO DEL CAMBIO DE CODIGO DE ACCESO.
  2459. ; SUB_98()
  2460. ; la rutina no requiere parametros externos. pone el nuevo codigo de acceso
  2461. ; provisoriamente en STATE_99_BIS, y luego de validar la informacion, la 
  2462. ; introduce en STATE_98 (si la validacion da algun error, se sale de la 
  2463. ; rutina sin cambiar el codigo del patch (queda STATE_98 como estaba).
  2464. ; la forma de cambiar el codigo de acesso, es la siguiente:
  2465. ;
  2466. ;      (codigo nuevo) + "#" + (codigo nuevo) + "#"
  2467. ;
  2468. ; de esta manera se entra y valida el nuevo codigo, cualquier alteracion hara
  2469. ; que no se valide y por consiguiente no se cambie el valor STATE_98.
  2470. ; para abortar la operacion se puede perfectamente oprimir "*", con lo cual
  2471. ; uno sale del modo de cambio de parametros y la repetidora continua 
  2472. ; funcionando como estaba.
  2473. ; el largo del codigo de acesso no puede ser mayor de 15 caracteres o menor
  2474. ; de 1 caracter.
  2475. ; ***************************************************************************
  2476. SUB_98
  2477.     PSHS    A,B,X,Y
  2478.     LDA     #$89
  2479.     JSR     VALIDATE
  2480.     CMPB    #$01        
  2481.     BEQ     END_SUB_98      ; checkeo si eligieron esta funcion o no
  2482.  
  2483.     LDX     #STATE_98
  2484.     STX     OFS_TABLA
  2485.     JSR     CODE_MANAGER
  2486.     JSR     OUT             ; para que no se active ninguna otra sub
  2487. END_SUB_98
  2488.     PULS    A,B,X,Y
  2489.     RTS
  2490.     ; end ---------------------------------------------------------------        
  2491.  
  2492. ; ***************************************************************************
  2493. ; RUTINA DE MANEJO DEL CAMBIO DE CODIGO DE ACCESO.
  2494. ; SUB_99()
  2495. ; la rutina no requiere parametros externos. pone el nuevo codigo de acceso
  2496. ; provisoriamente en STATE_99_BIS, y luego de validar la informacion, la 
  2497. ; introduce en STATE_99 (si la validacion da algun error, se sale de la 
  2498. ; rutina sin cambiar el codigo de acesso (queda STATE_99 como estaba).
  2499. ; la forma de cambiar el codigo de acesso, es la siguiente:
  2500. ;
  2501. ;      (codigo nuevo) + "#" + (codigo nuevo) + "#"
  2502. ;
  2503. ; de esta manera se entra y valida el nuevo codigo, cualquier alteracion hara
  2504. ; que no se valide y por consiguiente no se cambie el valor STATE_99.
  2505. ; para abortar la operacion se puede perfectamente oprimir "*", con lo cual
  2506. ; uno sale del modo de cambio de parametros y la repetidora continua 
  2507. ; funcionando como estaba.
  2508. ; el largo del codigo de acesso no puede ser mayor de 15 caracteres o menor
  2509. ; de 1 caracter.
  2510. ; ***************************************************************************
  2511. SUB_99        
  2512.     PSHS    A,B,X,Y
  2513.     LDA     #$99
  2514.     JSR     VALIDATE
  2515.     CMPB    #$01        
  2516.     BEQ     END_99          ; checkeo si eligieron esta funcion o no
  2517.  
  2518.     LDX     #STATE_99
  2519.     STX     OFS_TABLA
  2520.     JSR     CODE_MANAGER
  2521.     JSR     OUT             ; para que no se active ninguna otra sub
  2522. END_99
  2523.     PULS    A,B,X,Y
  2524.     RTS
  2525.     ; end ---------------------------------------------------------------        
  2526.  
  2527. ; ***************************************************************************
  2528. ; RUTINA DE MANEJO DEL CAMBIO DE CODIGO DE ACCESO.
  2529. ; CODE_MANAGER()
  2530. ; esta rutina le brinda el servicio a SUB_98 y a SUB_99. estas rutinas le
  2531. ; ponen en OFS_TABLA el address de STATE_98 o STATE_99 respectivamente.
  2532. ; el resto del funcionamiento esta explicado en cada una de las rutinas antes
  2533. ; mencionadas.
  2534. ; ***************************************************************************
  2535. CODE_MANAGER
  2536.     PSHS    A,B,X,Y
  2537.                 ; aqui verdaderamente comiena el prog.
  2538.     LDX     #STATE_99_BIS
  2539.     LDA     #$00
  2540. SUB_99_LOOP
  2541.     LDB     #$01
  2542.     JSR     DTMF_TECLADO
  2543.     LDB     PRESSED_KEY
  2544.     CMPB    #$0B
  2545.     BEQ     END_SUB_99              ; si oprime "*", entonces sale
  2546.     
  2547.     STB     ,X                      ; primero lo grabo, para que si se oprimio "#", el mismo quede en la variable
  2548.     
  2549.     CMPB    #$0C
  2550.     BEQ     CHECK_PASSWORD
  2551.     
  2552.     LEAX    1,X
  2553.     INCA
  2554.     CMPA    #17
  2555.     BNE     SUB_99_LOOP             ; si pasa los 15 caracteres, genera artificialmente un abort de tipo $0B ("*") de salida total
  2556.     
  2557.     LDA     #$0B
  2558.     STA     ABORT_MODE
  2559.     BRA     END_SUB_99
  2560. CHECK_PASSWORD          ; aqui checkeamos nuevamente el codigo de acesso
  2561.     LDY     #STATE_99_BIS
  2562.     LDA     ,Y
  2563.     CMPA    #$0C
  2564.     BNE     CHECK_LOOP_99           ; si el codigo es de 0 digitos de longitud realizo un abort (ya que el largo minimo es de 1 digito)
  2565.  
  2566.     LDA     #$0B
  2567.     STA     ABORT_MODE
  2568.     BRA     END_SUB_99
  2569. CHECK_LOOP_99
  2570.     LDB     #$01
  2571.     JSR     DTMF_TECLADO
  2572.     
  2573.     LDB     PRESSED_KEY
  2574.     CMPB    #$0B
  2575.     BEQ     END_SUB_99              ; si oprime "*", entonces sale
  2576.  
  2577.     LDA     PRESSED_KEY
  2578.     CMPA    ,Y
  2579.     BNE     END_SUB_99
  2580.     
  2581.     LDA     ,Y
  2582.     LEAY    1,Y
  2583.     CMPA    #$0C                    ; cuando aparece un "#" ($0C) quiere decir que termino el codigo de acceso        
  2584.     BNE     CHECK_LOOP_99     
  2585.             ; si logra pasar el checkeo, entonces lo copia en STATE_99
  2586.     LDX     #STATE_99_BIS
  2587.     LDY     OFS_TABLA
  2588.     LDB     #16
  2589.     JSR     STRINGCOPY              ; ya estoy seguro de que el nuevo codigo esta correcto, por lo tanto lo introduzco en STATE_99
  2590. END_SUB_99        
  2591.     PULS    A,B,X,Y
  2592.     RTS
  2593.     ; end ---------------------------------------------------------------        
  2594.  
  2595.     END
  2596.